From 2dc65c0f7378c41355c5d9d499298e235368ae03 Mon Sep 17 00:00:00 2001 From: Xuyan Ru Date: Mon, 23 Oct 2023 10:57:39 -0400 Subject: [PATCH] Update build process for LillyMol 7.0 (#25) --- Dockerfile | 56 +- Makefile | 48 + README.md | 314 +-- README_OSX.md | 106 - RELEASE_NOTES | 715 ------ contrib/README | 22 - contrib/README.md | 8 + contrib/{script/sh => bin}/abr.sh | 12 +- contrib/bin/ap.sh | 16 + contrib/bin/assign_donor_acceptor.sh | 14 + contrib/bin/assign_formal_charges.sh | 12 + .../{script/ruby => bin}/confusion_matrix.rb | 0 .../py => bin}/dicer_fragments_collate.py | 0 contrib/{script/ruby => bin}/dopattern.rb | 0 contrib/{script/sh => bin}/dopattern.sh | 0 .../{script/ruby => bin}/fragment_filter.rb | 2 +- contrib/{script/sh => bin}/gfp_erg.sh | 10 +- contrib/{script/perl => bin}/gfp_make.pl | 0 contrib/{script/sh => bin}/ghose_crippen.sh | 12 +- contrib/bin/graph_edit_changes.sh | 11 +- contrib/bin/iwdescr.sh | 17 + contrib/{script/ruby => bin}/iwqb.rb | 4 +- contrib/bin/jwcats.sh | 16 + contrib/{script/sh => bin}/jwdist.sh | 11 +- contrib/bin/medchem_wizard.sh | 18 + contrib/{script/py => bin}/mkbenzene.py | 0 .../sh => bin}/pubchem_fingerprints.sh | 14 +- contrib/bin/random_molecular_permutations.sh | 49 + contrib/{script/py => bin}/rdkitfp2gfp.py | 0 contrib/bin/reduced_graph.sh | 18 +- contrib/{script/py => bin}/smiles2png.py | 0 .../ruby => bin}/svmfp_summarise_results.rb | 0 contrib/{script/ruby => bin}/vf_main.rb | 0 .../ruby => bin}/vf_record_selector.rb | 0 contrib/{script/sh => bin}/zof.sh | 18 +- .../wildman_crippen.dat | 262 -- contrib/data/DEL/AnnotationQueries/data | Bin 305098 -> 0 bytes contrib/script/README | 25 - contrib/script/py/pybase/pyopmo.py | 4 +- contrib/script/ruby/lib/iwcmdline.rb | 291 --- contrib/script/sh/ap.sh | 13 - contrib/script/sh/iwdescr.sh | 16 - contrib/script/sh/jwcats.sh | 14 - data/AAREADME | 8 + .../#vinyl_halide_2_halogens.qry# | 22 + data/MedchemWizard/Acid_isosteres..rxn | 16 + data/MedchemWizard/Acid_isosteres.1.rxn | 11 + data/MedchemWizard/Acid_isosteres.10.rxn | 12 + data/MedchemWizard/Acid_isosteres.11.rxn | 12 + data/MedchemWizard/Acid_isosteres.12.rxn | 12 + data/MedchemWizard/Acid_isosteres.13.rxn | 12 + data/MedchemWizard/Acid_isosteres.14.rxn | 12 + data/MedchemWizard/Acid_isosteres.15.rxn | 12 + data/MedchemWizard/Acid_isosteres.16.rxn | 11 + data/MedchemWizard/Acid_isosteres.17.rxn | 12 + data/MedchemWizard/Acid_isosteres.18.rxn | 12 + data/MedchemWizard/Acid_isosteres.19.rxn | 12 + data/MedchemWizard/Acid_isosteres.2.rxn | 11 + data/MedchemWizard/Acid_isosteres.20.rxn | 11 + data/MedchemWizard/Acid_isosteres.21.rxn | 11 + data/MedchemWizard/Acid_isosteres.22.rxn | 11 + data/MedchemWizard/Acid_isosteres.23.rxn | 11 + data/MedchemWizard/Acid_isosteres.24.rxn | 11 + data/MedchemWizard/Acid_isosteres.25.rxn | 11 + data/MedchemWizard/Acid_isosteres.26.rxn | 11 + data/MedchemWizard/Acid_isosteres.27.rxn | 11 + data/MedchemWizard/Acid_isosteres.28.rxn | 11 + data/MedchemWizard/Acid_isosteres.29.rxn | 11 + data/MedchemWizard/Acid_isosteres.3.rxn | 11 + data/MedchemWizard/Acid_isosteres.30.rxn | 11 + data/MedchemWizard/Acid_isosteres.31.rxn | 11 + data/MedchemWizard/Acid_isosteres.32.rxn | 12 + data/MedchemWizard/Acid_isosteres.33.rxn | 11 + data/MedchemWizard/Acid_isosteres.34.rxn | 11 + data/MedchemWizard/Acid_isosteres.35.rxn | 11 + data/MedchemWizard/Acid_isosteres.36.rxn | 11 + data/MedchemWizard/Acid_isosteres.37.rxn | 11 + data/MedchemWizard/Acid_isosteres.38.rxn | 11 + data/MedchemWizard/Acid_isosteres.39.rxn | 11 + data/MedchemWizard/Acid_isosteres.4.rxn | 11 + data/MedchemWizard/Acid_isosteres.40.rxn | 11 + data/MedchemWizard/Acid_isosteres.41.rxn | 11 + data/MedchemWizard/Acid_isosteres.42.rxn | 11 + data/MedchemWizard/Acid_isosteres.43.rxn | 11 + data/MedchemWizard/Acid_isosteres.44.rxn | 11 + data/MedchemWizard/Acid_isosteres.45.rxn | 11 + data/MedchemWizard/Acid_isosteres.46.rxn | 11 + data/MedchemWizard/Acid_isosteres.5.rxn | 11 + data/MedchemWizard/Acid_isosteres.6.rxn | 11 + data/MedchemWizard/Acid_isosteres.7.rxn | 11 + data/MedchemWizard/Acid_isosteres.8.rxn | 11 + data/MedchemWizard/Acid_isosteres.9.rxn | 11 + data/MedchemWizard/Acid_isosteres.rb | 89 + .../Aryl_group_addition.add_2-pyridyl.rxn | 14 + .../Aryl_group_addition.add_3-pyridyl.rxn | 14 + .../Aryl_group_addition.add_4-pyridyl.rxn | 14 + .../Aryl_group_addition.add_benzyl.rxn | 13 + .../Aryl_group_addition.add_phenyl.rxn | 14 + .../Aryl_substituent_Scan.add_Br.rxn | 10 + .../Aryl_substituent_Scan.add_Cl.rxn | 10 + .../Aryl_substituent_Scan.add_F.rxn | 10 + .../Aryl_substituent_Scan.add_Me.rxn | 10 + .../Aryl_substituent_Scan.add_acetamido.rxn | 10 + .../Aryl_substituent_Scan.add_carbamoyl.rxn | 10 + .../Aryl_substituent_Scan.add_carboxylate.rxn | 10 + .../Aryl_substituent_Scan.add_ethoxy.rxn | 10 + .../Aryl_substituent_Scan.add_hydroxy.rxn | 10 + ...ryl_substituent_Scan.add_hydroxymethyl.rxn | 10 + .../Aryl_substituent_Scan.add_methoxy.rxn | 10 + ...Aryl_substituent_Scan.add_methylketone.rxn | 10 + ...ryl_substituent_Scan.add_methylsulfone.rxn | 10 + ...l_substituent_Scan.add_methylsulfoxide.rxn | 10 + .../Aryl_substituent_Scan.add_nitrile.rxn | 10 + .../Aryl_substituent_Scan.add_nitrogen.rxn | 10 + .../Aryl_substituent_Scan.add_sulfonamide.rxn | 12 + .../Aryl_substituent_Scan.add_t-butyl.rxn | 10 + ..._substituent_Scan.add_trifluoromethoxy.rxn | 10 + ...yl_substituent_Scan.add_trifluromethyl.rxn | 10 + .../Aryl_substituent_Scan.add_urea.rxn | 10 + data/MedchemWizard/Aryl_substituent_Scan.rb | 83 + data/MedchemWizard/Ester-amide_isosteres..rxn | 13 + ...Ester-amide_isosteres.1-3-4_oxadiazole.rxn | 16 + .../Ester-amide_isosteres.2_pyrazine.rxn | 16 + ...ster-amide_isosteres._T_1-2-3_triazole.rxn | 16 + ...er-amide_isosteres._T_1-2-4_oxadiazole.rxn | 16 + ...ster-amide_isosteres._T_1-2-4_triazole.rxn | 16 + ...r-amide_isosteres._T_1-trifluoromethyl.rxn | 16 + ...er-amide_isosteres._T_cyclopropylamine.rxn | 16 + .../Ester-amide_isosteres._T_fluorovinyl.rxn | 16 + .../Ester-amide_isosteres._T_oxetane.rxn | 16 + ...Ester-amide_isosteres._T_oxetane_ether.rxn | 16 + .../Ester-amide_isosteres._T_sulfonamide.rxn | 16 + .../Ester-amide_isosteres.amidine.rxn | 16 + ...r-amide_isosteres.amino-1-3-4-_oxazole.rxn | 16 + ...er-amide_isosteres.amino_1-2-4-oxazole.rxn | 16 + .../Ester-amide_isosteres.amino_oxazole.rxn | 16 + .../Ester-amide_isosteres.cyano_oxime.rxn | 16 + ...sosteres.isomeric_amino-1-3-4-_oxazole.rxn | 16 + ...isomeric_reversed_amino-1-3-4-_oxazole.rxn | 16 + .../Ester-amide_isosteres.isoxazole.rxn | 16 + .../Ester-amide_isosteres.pyrazine.rxn | 16 + ...ide_isosteres.reverse_1-3-4_oxadiazole.rxn | 16 + .../Ester-amide_isosteres.reverse_amidine.rxn | 16 + ...-amide_isosteres.reverse_amino_oxazole.rxn | 16 + ...er-amide_isosteres.reverse_cyano_oxime.rxn | 16 + ...ster-amide_isosteres.reverse_tetrazole.rxn | 16 + ...Ester-amide_isosteres.reverse_triazole.rxn | 16 + ...isosteres.reversed_amino-1-2-4-oxazole.rxn | 16 + ...sosteres.reversed_amino-1-3-4-_oxazole.rxn | 16 + .../Ester-amide_isosteres.tetrazole.rxn | 16 + .../MedchemWizard/MedChemWizard_reactions.txt | 115 + .../Metabolism.Benzylic_oxidation.rxn | 13 + .../Metabolism.Benzylic_substitution.rxn | 13 + .../Metabolism.Benzylic_substitution_C1.rxn | 13 + .../Metabolism.Benzylic_substitution_C2.rxn | 14 + ...Metabolism.Biaryl_-_protect_4_position.rxn | 13 + ...abolism.Biaryl_-_protect_4_position_Br.rxn | 13 + ...tabolism.Biaryl_-_protect_4_position_C.rxn | 13 + ...abolism.Biaryl_-_protect_4_position_Cl.rxn | 13 + ...tabolism.Biaryl_-_protect_4_position_F.rxn | 13 + ...Metabolism.Biaryl_-_protect_6_position.rxn | 13 + ...abolism.Biaryl_-_protect_6_position_Br.rxn | 13 + ...tabolism.Biaryl_-_protect_6_position_C.rxn | 13 + ...abolism.Biaryl_-_protect_6_position_Cl.rxn | 13 + ...tabolism.Biaryl_-_protect_6_position_F.rxn | 13 + ...Metabolism.Biaryl_-_protect_7_position.rxn | 13 + ...abolism.Biaryl_-_protect_7_position_Br.rxn | 13 + ...tabolism.Biaryl_-_protect_7_position_C.rxn | 13 + ...abolism.Biaryl_-_protect_7_position_Cl.rxn | 13 + ...tabolism.Biaryl_-_protect_7_position_F.rxn | 13 + .../Metabolism.Block_ortho_to_a_phenol.rxn | 14 + .../Metabolism.Block_ortho_to_a_phenol_C1.rxn | 13 + .../Metabolism.Block_ortho_to_a_phenol_C2.rxn | 14 + ...Metabolism.Block_ortho_to_a_phenol_Cl1.rxn | 13 + ...Metabolism.Block_ortho_to_a_phenol_Cl2.rxn | 14 + .../Metabolism.Block_ortho_to_a_phenol_F1.rxn | 13 + .../Metabolism.Block_ortho_to_a_phenol_F2.rxn | 14 + .../Metabolism.Catechol_T_methylenedioxy.rxn | 14 + .../Metabolism.OEt_T_OCH2CF3.rxn | 15 + data/MedchemWizard/Metabolism.OEt_T_OcPr.rxn | 13 + data/MedchemWizard/Metabolism.OH_T_OCF3.rxn | 14 + data/MedchemWizard/Metabolism.OH_T_OCH2F.rxn | 13 + data/MedchemWizard/Metabolism.OH_T_OCHF2.rxn | 13 + data/MedchemWizard/Metabolism.OH_T_OMe.rxn | 11 + data/MedchemWizard/Metabolism.OMe_T_OCF3.rxn | 15 + data/MedchemWizard/Metabolism.OMe_T_OCH2F.rxn | 13 + data/MedchemWizard/Metabolism.OMe_T_OCHF2.rxn | 14 + data/MedchemWizard/Metabolism.OMe_T_OEt.rxn | 13 + data/MedchemWizard/Metabolism.OMe_T_OPr.rxn | 13 + data/MedchemWizard/Metabolism.OMe_T_OcPr.rxn | 14 + data/MedchemWizard/Metabolism.OMe_T_OiPr.rxn | 13 + .../Metabolism.Phenol_T_hydroxymethyl.rxn | 15 + .../Metabolism.Unsubstituted_aryl_T_4-Cl.rxn | 13 + .../Metabolism.Unsubstituted_aryl_T_4-F.rxn | 13 + .../Metabolism.Unsubstituted_aryl_T_4-Me.rxn | 13 + .../Metabolism.acetylene_T_ether.rxn | 10 + .../Metabolism.alkene_T_alkane.rxn | 9 + .../Metabolism.alkene_T_cyclopropyl.rxn | 15 + .../Metabolism.alkene_T_ether.rxn | 10 + .../Metabolism.methyl_T_hydroxymethyl.rxn | 13 + ...tabolism.pyridyl_T_2-6-dimethylpyridyl.rxn | 14 + .../Metabolism.pyridyl_T_2-methyl_pyridyl.rxn | 13 + .../Metabolism.pyridyl_T_N-oxide.rxn | 12 + ...aryl_rings.1-4-phenyl_T_2.2.2_tricycle.rxn | 13 + .../More_aryl_rings.aryl_C_T_aryl_N.rxn | 9 + .../More_aryl_rings.aryl_n_T_aryl_c.rxn | 9 + .../More_aryl_rings.ccn_T_ncc.rxn | 10 + .../MedchemWizard/More_aryl_rings.cn_T_nc.rxn | 12 + .../MedchemWizard/More_aryl_rings.cn_T_nn.rxn | 10 + .../More_aryl_rings.furan_T_phenyl.rxn | 20 + .../More_aryl_rings.indole_T_indazole.rxn | 9 + .../More_aryl_rings.indole_T_indolizine.rxn | 19 + data/MedchemWizard/More_aryl_rings.nH_T_O.rxn | 9 + data/MedchemWizard/More_aryl_rings.nH_T_s.rxn | 9 + .../More_aryl_rings.ncc_T_ncn.rxn | 9 + .../More_aryl_rings.ncc_T_nnc.rxn | 9 + .../More_aryl_rings.nccn_T_ncccn.rxn | 16 + .../More_aryl_rings.nccn_T_ncnc.rxn | 10 + .../More_aryl_rings.ncn_T_nccn.rxn | 16 + .../More_aryl_rings.nn_T_ncn.rxn | 15 + .../More_aryl_rings.nnnc_T_nncn.rxn | 10 + .../More_aryl_rings.nocn_T_nonc.rxn | 10 + .../More_aryl_rings.nonc_T_nocn.rxn | 10 + .../More_aryl_rings.nscn_T_nsnc.rxn | 10 + data/MedchemWizard/More_aryl_rings.o_T_NH.rxn | 9 + data/MedchemWizard/More_aryl_rings.o_T_s.rxn | 9 + .../More_aryl_rings.ocn_T_onc.rxn | 10 + .../More_aryl_rings.onc_T_ocn.rxn | 10 + ...ore_aryl_rings.phenyl_--_isoquinolinyl.rxn | 15 + ...More_aryl_rings.phenyl_T_benzimidazole.rxn | 15 + .../More_aryl_rings.phenyl_T_cinnoline.rxn | 15 + .../More_aryl_rings.phenyl_T_furan.rxn | 15 + .../More_aryl_rings.phenyl_T_indole.rxn | 15 + .../More_aryl_rings.phenyl_T_naphthyl.rxn | 15 + .../More_aryl_rings.phenyl_T_phthalazine.rxn | 15 + .../More_aryl_rings.phenyl_T_quinazoline.rxn | 15 + .../More_aryl_rings.phenyl_T_quinolinyl.rxn | 15 + .../More_aryl_rings.phenyl_T_quinoxaline.rxn | 15 + .../More_aryl_rings.phenyl_T_thiophene.rxn | 15 + .../More_aryl_rings.pyrrole_T_indole.rxn | 14 + .../More_aryl_rings.pyrrole_T_isoindole.rxn | 13 + .../More_aryl_rings.pyrrole_T_phenyl.rxn | 20 + data/MedchemWizard/More_aryl_rings.s_T_NH.rxn | 9 + data/MedchemWizard/More_aryl_rings.s_T_o.rxn | 9 + .../More_aryl_rings.scn_T_snc.rxn | 10 + .../More_aryl_rings.snc_T_scn.rxn | 10 + .../More_aryl_rings.thiophene_T_phenyl.rxn | 20 + .../Phenol_isosteres.N-Me_urea.rxn | 15 + data/MedchemWizard/Phenol_isosteres.Urea.rxn | 15 + .../Phenol_isosteres.acetamide.rxn | 15 + .../Phenol_isosteres.benzimidazole.rxn | 16 + .../Phenol_isosteres.benzotriazole.rxn | 16 + .../Phenol_isosteres.hydroxymethyl.rxn | 15 + .../Phenol_isosteres.imidazolone.rxn | 16 + .../Phenol_isosteres.indazole.rxn | 16 + .../MedchemWizard/Phenol_isosteres.indole.rxn | 16 + .../MedchemWizard/Phenol_isosteres.isatin.rxn | 16 + .../Phenol_isosteres.oxindole.rxn | 17 + .../Phenol_isosteres.sulfamide.rxn | 15 + .../Phenol_isosteres.sulfonamide.rxn | 15 + data/MedchemWizard/REACTIONS | 260 ++ ..._H_Replacement.add_2,2-dimethylethanol.rxn | 11 + .../Simple_H_Replacement.add_CH2-CO2H.rxn | 11 + ...ement.add_CH2-NH-CH2-CH2-methylsulfone.rxn | 11 + .../Simple_H_Replacement.add_F.rxn | 11 + ...placement.add_N,N-dimethylethanolamine.rxn | 11 + ...lacement.add_N,N-dimethylpropanolamine.rxn | 11 + ...mple_H_Replacement.add_N-Me_piperazine.rxn | 11 + ..._Replacement.add_O-CH2-CH2-pyrrolidine.rxn | 11 + .../Simple_H_Replacement.add_acetamide.rxn | 11 + .../Simple_H_Replacement.add_amino.rxn | 11 + .../Simple_H_Replacement.add_carbamoyl.rxn | 11 + .../Simple_H_Replacement.add_carboxylate.rxn | 11 + .../Simple_H_Replacement.add_dimethyl.rxn | 11 + .../Simple_H_Replacement.add_ethyl.rxn | 11 + .../Simple_H_Replacement.add_hydroxy.rxn | 11 + .../Simple_H_Replacement.add_hydroxyethyl.rxn | 11 + ...Simple_H_Replacement.add_hydroxymethyl.rxn | 11 + .../Simple_H_Replacement.add_methyl.rxn | 11 + .../Simple_H_Replacement.add_morpholinyl.rxn | 11 + .../Simple_H_Replacement.add_sulfonamide.rxn | 12 + .../Simple_H_Replacement.add_sulfone.rxn | 13 + .../Simple_H_Replacement.add_t-butyl.rxn | 11 + .../Simple_H_Replacement.amine_to_N-Ac.rxn | 11 + .../Simple_H_Replacement.amine_to_N-Me.rxn | 11 + .../Simple_H_Replacement.amine_to_N-Me2.rxn | 11 + ...imple_H_Replacement.amine_to_carbamate.rxn | 11 + .../Simple_H_Replacement.amine_to_urea.rxn | 11 + ...imple_H_Replacement.nitrogen_to_oxygen.rxn | 11 + data/MedchemWizard/Simple_H_Replacements.rb | 78 + data/MedchemWizard/Switches.reverse_amide.rxn | 11 + .../Switches.reverse_sulfonamide.rxn | 11 + ...reak_open_a_5-_ring_to_form_pseudoring.rxn | 14 + ...break_open_a_5-ring_to_form_pseudoring.rxn | 18 + ...break_open_a_6-ring_to_form_pseudoring.rxn | 18 + .../Virtual_Ring.break_open_a_cycloheptyl.rxn | 9 + ...irtual_Ring.break_open_a_cycloheptyl_1.rxn | 9 + ...irtual_Ring.break_open_a_cycloheptyl_2.rxn | 9 + ...irtual_Ring.break_open_a_cycloheptyl_3.rxn | 9 + ...irtual_Ring.break_open_a_cycloheptyl_4.rxn | 9 + ...Virtual_Ring.break_open_a_cyclohexyl_1.rxn | 9 + ...Virtual_Ring.break_open_a_cyclohexyl_2.rxn | 9 + ...Virtual_Ring.break_open_a_cyclohexyl_3.rxn | 9 + ...irtual_Ring.break_open_a_cyclopentyl_1.rxn | 9 + ...irtual_Ring.break_open_a_cyclopentyl_2.rxn | 9 + ...Ring.create_a_new_ring_with_-O-CH2-CH2.rxn | 14 + ..._Ring.create_a_new_ring_with_CH2-CH2-O.rxn | 15 + ...al_Ring.create_a_new_ring_with_CH2-CH2.rxn | 16 + ..._Ring.create_a_new_ring_with_CH2-N-CH2.rxn | 15 + ..._Ring.create_a_new_ring_with_CH2-O-CH2.rxn | 15 + ...tual_Ring.create_a_new_ring_with_CH2-O.rxn | 16 + ..._Ring.create_a_new_ring_with_CH2-S-CH2.rxn | 15 + ...tual_Ring.create_a_new_ring_with_CH2-S.rxn | 16 + ...tual_Ring.create_a_new_ring_with_O-CH2.rxn | 14 + ...tual_Ring.create_a_new_ring_with_S-CH2.rxn | 14 + data/MedchemWizard/make_reactions.rb | 69 + .../data => data}/abraham_hbond_constants | 0 {contrib/data => data}/chembl.ranges | 0 data/pubchem_fingerprints/AAREADME.md | 13 + .../pubchem_fingerprints/section4.smt | 0 .../pubchem_fingerprints/section5.smt | 0 .../pubchem_fingerprints/section6.smt | 0 .../pubchem_fingerprints/section7.smt | 0 .../queries/PAINS/amino_acridine_A.qry | 0 .../queries/PAINS/anil_alk_ene.qry | 0 .../queries/PAINS/anil_di_alk_A.qry | 0 .../queries/PAINS/anil_di_alk_B.qry | 0 .../queries/PAINS/anil_di_alk_C.qry | 0 .../queries/PAINS/anil_di_alk_D.qry | 0 .../queries/PAINS/anil_di_alk_E.qry | 0 .../queries/PAINS/anil_no_alk.qry | 0 .../queries/PAINS/anthranil_acid_A.qry | 0 .../queries/PAINS/anthranil_one_A.qry | 0 .../data => data}/queries/PAINS/azo_A.qry | 0 .../queries/PAINS/catechol_A.qry | 0 .../queries/PAINS/cyano_ene_amine_A.qry | 0 .../queries/PAINS/cyano_imine_A.qry | 0 .../queries/PAINS/cyano_imine_B.qry | 0 .../queries/PAINS/cyano_pyridone_A.qry | 0 .../queries/PAINS/cyano_pyridone_B.qry | 0 .../queries/PAINS/dhp_bis_amino_CN.qry | 0 .../queries/PAINS/diazox_sulfon_A.qry | 0 .../data => data}/queries/PAINS/dyes3A.qry | 0 .../queries/PAINS/ene_cyano_A.qry | 0 .../queries/PAINS/ene_five_het_A.qry | 0 .../queries/PAINS/ene_five_het_B.qry | 0 .../queries/PAINS/ene_five_het_C.qry | 0 .../queries/PAINS/ene_five_het_E.qry | 0 .../queries/PAINS/ene_five_het_F.qry | 0 .../queries/PAINS/ene_five_one_A.qry | 0 .../queries/PAINS/ene_one_ene_A.qry | 0 .../queries/PAINS/ene_one_ester.qry | 0 .../queries/PAINS/ene_one_hal.qry | 0 .../queries/PAINS/ene_rhod_A.qry | 0 .../queries/PAINS/ene_six_het_A.qry | 0 .../data => data}/queries/PAINS/het_65_A.qry | 0 .../queries/PAINS/het_6_tetrazine.qry | 0 .../queries/PAINS/het_pyridiniums_A.qry | 0 .../queries/PAINS/hzone_acyl_naphthol.qry | 0 .../queries/PAINS/hzone_anil_di_alk.qry | 0 .../queries/PAINS/hzone_enamin.qry | 0 .../queries/PAINS/hzone_phenol_A.qry | 0 .../queries/PAINS/hzone_phenol_B.qry | 0 .../queries/PAINS/hzone_pipzn.qry | 0 .../queries/PAINS/imidazole_A.qry | 0 .../queries/PAINS/imine_one_A.qry | 0 .../queries/PAINS/imine_one_fives.qry | 0 .../queries/PAINS/imine_one_isatin.qry | 0 .../queries/PAINS/indol_3yl_alk.qry | 0 .../queries/PAINS/keto_keto_beta_A.qry | 0 .../data => data}/queries/PAINS/mannich_A.qry | 0 .../queries/PAINS/naphth_amino_A.qry | 0 .../queries/PAINS/naphth_amino_B.qry | 0 .../data => data}/queries/PAINS/pyrrole_A.qry | 0 .../data => data}/queries/PAINS/pyrrole_B.qry | 0 .../queries/PAINS/queries_latest | 0 .../data => data}/queries/PAINS/quinone_A.qry | 0 .../queries/PAINS/rhod_sat_A.qry | 0 .../queries/PAINS/sulfonamide_A.qry | 0 .../queries/PAINS/sulfonamide_B.qry | 0 .../queries/PAINS/thiaz_ene_A.qry | 0 .../queries/PAINS/thiaz_ene_B.qry | 0 .../queries/PAINS/thio_carbonate_A.qry | 0 .../queries/PAINS/thio_dibenzo.qry | 0 .../queries/PAINS/thiophene_amino_Aa.qry | 0 .../queries/PAINS/thiophene_amino_Ab.qry | 0 .../queries/PAINS/thiophene_hydroxy.qry | 0 .../data => data}/queries/abraham/Abraham | 0 .../data => data}/queries/abraham/Alpha2H | 0 .../queries/abraham/ConstantinouGani.Table1 | 0 .../queries/abraham/ConstantinouGani.Table13 | 0 .../abraham/ConstantinouGani.Table13.First | 0 .../queries/abraham/ConstantinouGani.Table2 | 0 .../queries/abraham/ConstantinouGani.Table24 | 0 .../queries/abraham/ConstantinouGani.Table3 | 0 .../queries/abraham/ConstantinouGani.Table4 | 0 .../queries/charges/2_amino_pyridine.qry | 0 .../queries/charges/4_amino_pyridine.qry | 0 .../queries/charges/N_acylpyrazolidinone.qry | 0 .../queries/charges/N_acylsulfonamide.qry | 0 .../data => data}/queries/charges/acid.qry | 0 {contrib/data => data}/queries/charges/active | 0 .../queries/charges/aliphatic_amine.qry | 0 .../charges/aliphatic_amine_restricted.qry | 0 .../data => data}/queries/charges/amidine.qry | 1 + .../queries/charges/amino_terminal.qry | 0 .../charges/amino_terminal_restricted.qry | 0 .../queries/charges/carboxylic_acid.qry | 0 {contrib/data => data}/queries/charges/fl | 0 .../queries/charges/guanidine.qry | 0 .../queries/charges/hydrazine.qry | 0 .../queries/charges/hydroxamic_acid.qry | 0 .../queries/charges/imidazole_basic.qry | 0 .../queries/charges/imidazolidinone.qry | 0 .../data => data}/queries/charges/imide.qry | 0 .../data => data}/queries/charges/imine.qry | 0 .../data => data}/queries/charges/negative | 0 .../queries/charges/phenolate.qry | 0 .../queries/charges/phosphonate.qry | 0 .../data => data}/queries/charges/positive | 0 .../queries/charges/pyrazine.qry | 0 .../queries/charges/pyrazolidinone.qry | 0 .../queries/charges/pyridazine.qry | 0 data/queries/charges/pyridine_dione.qry | 4 + .../queries/charges/pyrimidine.qry | 0 .../data => data}/queries/charges/queries | 1 + .../queries/charges/sulfonic_acid.qry | 0 .../queries/charges/tetrazole.qry | 0 .../queries/charges/thiazolidinedione.qry | 0 .../queries/complex_chirality/alanine.smi | 0 .../queries/functional_groups/EWG.txt | 0 .../functional_groups/NAS_electrophile.qry | 0 .../queries/functional_groups/NNH2.qry | 0 .../functional_groups/a_bromo_ketone.qry | 0 .../queries/functional_groups/a_h_ketones.qry | 0 .../a_h_ketones_nonsymmetric.qry | 0 .../a_h_ketones_symmetric.qry | 0 .../queries/functional_groups/acetal.qry | 0 .../functional_groups/acid_chlorides.qry | 0 .../queries/functional_groups/acrolein.qry | 0 .../queries/functional_groups/acrylate.qry | 0 .../functional_groups/acyl_chlorides.qry | 0 .../queries/functional_groups/alcohols.qry | 0 .../functional_groups/alcohols_alkyl.qry | 0 .../functional_groups/aldehyde_aliphatic.qry | 0 .../functional_groups/aldehyde_aromatic.qry | 0 .../queries/functional_groups/aldehydes.qry | 0 .../functional_groups/aliphatic_aldehyde.qry | 0 .../queries/functional_groups/alkene.qry | 0 .../functional_groups/alkene_activated.qry | 0 .../alkene_non_activated.qry | 0 .../alkyl_sulfur_pyrimidine.qry | 0 .../queries/functional_groups/alkynes.qry | 0 .../functional_groups/alkynes_internal.qry | 0 .../alkynes_internal_activated.qry | 0 .../alkynes_internal_non_activated.qry | 0 .../functional_groups/alkynes_terminal.qry | 0 .../alkynes_terminal_activated.qry | 0 .../alkynes_terminal_non_activated.qry | 0 .../functional_groups/alpha_aminoacid.qry | 0 .../queries/functional_groups/amides.qry | 0 .../functional_groups/amides_aliphatic.qry | 0 .../functional_groups/amides_aromatic.qry | 0 .../functional_groups/amides_primary.qry | 0 .../functional_groups/amides_secondary.qry | 0 .../queries/functional_groups/amidines.qry | 0 .../functional_groups/amidines_primary.qry | 0 .../functional_groups/amidines_secondary.qry | 0 .../queries/functional_groups/amines.qry | 0 .../functional_groups/amines_aliphatic.qry | 0 .../amines_aliphatic_primary.qry | 0 .../amines_aliphatic_primary_branched.qry | 0 .../amines_aliphatic_primary_unbranched.qry | 0 .../amines_aliphatic_secondary.qry | 0 .../amines_aliphatic_secondary_acyclic.qry | 0 .../amines_aliphatic_secondary_cyclic.qry | 0 .../functional_groups/amines_aromatic.qry | 0 .../amines_aromatic_primary.qry | 0 .../amines_aromatic_secondary.qry | 0 .../amines_aromatic_secondary_1.qry | 0 .../amines_aromatic_secondary_2.qry | 0 .../amines_heteroaromatic_primary.qry | 0 .../functional_groups/amines_primary.qry | 0 .../amines_primary_unhindered.qry | 0 .../functional_groups/aromatic_aldehyde.qry | 0 .../queries/functional_groups/arylbromide.qry | 0 .../functional_groups/arylchloride.qry | 0 .../queries/functional_groups/aryliodide.qry | 0 .../queries/functional_groups/azide.qry | 0 .../functional_groups/azide_carbon.qry | 0 .../functional_groups/azide_sulfonyl.qry | 0 .../queries/functional_groups/badboron.qry | 0 .../functional_groups/beta_aminoacid.qry | 0 .../queries/functional_groups/boc.qry | 0 .../functional_groups/boronic_acids.qry | 0 .../queries/functional_groups/boronics.qry | 0 .../functional_groups/boronics_aliphatic.qry | 0 .../functional_groups/boronics_aromatic.qry | 0 .../queries/functional_groups/carbamate.qry | 0 .../functional_groups/carboxylic_acids.qry | 0 .../functional_groups/chloroformates.qry | 0 .../queries/functional_groups/cyano.qry | 0 .../queries/functional_groups/cyano_alkyl.qry | 0 .../queries/functional_groups/cyano_amine.qry | 0 .../queries/functional_groups/cyano_aryl.qry | 0 .../functional_groups/dicarbonyl_imide.qry | 0 .../queries/functional_groups/diols.qry | 0 .../queries/functional_groups/disulfide.qry | 0 .../queries/functional_groups/esters.qry | 0 .../functional_groups/esters_carboxylic.qry | 0 .../functional_groups/esters_methyl.qry | 0 .../esters_methyl_aliphatic.qry | 0 .../esters_methyl_aromatic.qry | 0 .../functional_groups/esters_methyl_ethyl.qry | 0 .../queries/functional_groups/ethers.qry | 0 .../functional_groups/fluorinecarbon.qry | 0 .../queries/functional_groups/fmoc.qry | 0 .../queries/functional_groups/fragments.qry | 0 .../queries/functional_groups/guanidines.qry | 0 .../guanidines_secondary_primary.qry | 0 .../guanidines_secondary_secondary.qry | 0 .../guanidines_sectert_primary.qry | 0 .../guanidines_tertiary_primary.qry | 0 .../guanidines_tertiary_secondary.qry | 0 .../functional_groups/halides_alkyl.qry | 0 .../functional_groups/halides_aryl.qry | 0 .../functional_groups/halides_benzyl.qry | 0 .../functional_groups/halides_hetero.qry | 0 .../queries/functional_groups/haloalkene.qry | 0 .../queries/functional_groups/hydrazides.qry | 0 .../queries/functional_groups/hydrazines.qry | 0 .../functional_groups/hydrazines_primary.qry | 0 .../queries/functional_groups/imines.qry | 0 .../functional_groups/imines_aliphatic.qry | 0 .../imines_halide_aromatic.qry | 0 .../queries/functional_groups/indole.qry | 0 .../queries/functional_groups/isocyanates.qry | 0 .../queries/functional_groups/isocyanides.qry | 0 .../functional_groups/isothiocyanates.qry | 0 .../queries/functional_groups/isotope.qry | 0 .../queries/functional_groups/ketal.qry | 0 .../queries/functional_groups/ketones.qry | 0 .../functional_groups/ketones_a_bromo.qry | 0 .../functional_groups/nhydroxyamides.qry | 0 .../queries/functional_groups/nitriles.qry | 0 .../queries/functional_groups/nitro.qry | 0 .../queries/functional_groups/nitro_del.qry | 0 .../functional_groups/nitro_fluoro.qry | 0 .../queries/functional_groups/nonorganic.qry | 0 .../queries/functional_groups/nvoc.qry | 0 .../functional_groups/o_amino_phenols.qry | 0 .../functional_groups/o_amino_thiophenols.qry | 0 .../functional_groups/o_iodo_aniline.qry | 0 .../functional_groups/o_iodo_sec_aniline.qry | 0 .../functional_groups/o_nitro_sec_aniline.qry | 0 .../queries/functional_groups/oxime.qry | 0 .../queries/functional_groups/phenols.qry | 0 .../queries/functional_groups/phosphorus.qry | 0 .../functional_groups/prim_aniline_fmoc.qry | 0 .../queries/functional_groups/propiolate.qry | 0 .../queries/functional_groups/propynal.qry | 0 .../queries/functional_groups/pyrazole.qry | 0 .../queries/functional_groups/queries_alc | 0 .../functional_groups/queries_complete | 0 .../queries/functional_groups/queries_del | 0 .../queries/functional_groups/queries_delnew | 0 .../functional_groups/sec_aniline_boc.qry | 0 .../functional_groups/sec_aniline_fmoc.qry | 0 .../queries/functional_groups/sec_boc.qry | 0 .../queries/functional_groups/sec_fmoc.qry | 0 .../functional_groups/sulfonamides.qry | 0 .../functional_groups/sulfonamides_acyl.qry | 0 .../functional_groups/sulfonamides_aryl.qry | 0 .../sulfonamides_primary.qry | 0 .../functional_groups/sulfonic_acids.qry | 0 .../functional_groups/sulfonyl_chlorides.qry | 0 .../functional_groups/suzuki_boronics.qry | 0 .../queries/functional_groups/tert_boc.qry | 0 .../queries/functional_groups/tert_fmoc.qry | 0 .../queries/functional_groups/tetrazole.qry | 0 .../queries/functional_groups/thiols.qry | 0 .../queries/functional_groups/thiophenols.qry | 0 .../queries/functional_groups/thp.qry | 0 .../functional_groups/triazine_chloro.qry | 0 .../functional_groups/triazine_dichloro.qry | 0 .../functional_groups/triazine_monochloro.qry | 0 .../functional_groups/triazine_trichloro.qry | 0 .../functional_groups/trifluoroborates.qry | 0 .../queries/functional_groups/trityl.qry | 0 .../queries/functional_groups/ynones.qry | 0 .../data => data}/queries/hbondpatterns/A.qry | 0 .../queries/hbondpatterns/A1A.qry | 0 .../queries/hbondpatterns/A1A1A.qry | 0 .../queries/hbondpatterns/A1A1D.qry | 0 .../queries/hbondpatterns/A1A2A.qry | 0 .../queries/hbondpatterns/A1A2D.qry | 0 .../queries/hbondpatterns/A1A3A.qry | 0 .../queries/hbondpatterns/A1A3D.qry | 0 .../queries/hbondpatterns/A1A4A.qry | 0 .../queries/hbondpatterns/A1A4D.qry | 0 .../queries/hbondpatterns/A1B1AE1A.qry | 0 .../queries/hbondpatterns/A1B1AEA.qry | 0 .../queries/hbondpatterns/A1B1AED.qry | 0 .../queries/hbondpatterns/A1B1DE1A.qry | 0 .../queries/hbondpatterns/A1B1DE1D.qry | 0 .../queries/hbondpatterns/A1B1DEA.qry | 0 .../queries/hbondpatterns/A1B1DED.qry | 0 .../queries/hbondpatterns/A1B2AE1A.qry | 0 .../queries/hbondpatterns/A1B2AE1D.qry | 0 .../queries/hbondpatterns/A1B2AE2A.qry | 0 .../queries/hbondpatterns/A1B2AEA.qry | 0 .../queries/hbondpatterns/A1B2AED.qry | 0 .../queries/hbondpatterns/A1B2DE1A.qry | 0 .../queries/hbondpatterns/A1B2DE1D.qry | 0 .../queries/hbondpatterns/A1B2DE2A.qry | 0 .../queries/hbondpatterns/A1B2DE2D.qry | 0 .../queries/hbondpatterns/A1B2DEA.qry | 0 .../queries/hbondpatterns/A1B2DED.qry | 0 .../queries/hbondpatterns/A1B3AE1A.qry | 0 .../queries/hbondpatterns/A1B3AE1D.qry | 0 .../queries/hbondpatterns/A1B3AE3A.qry | 0 .../queries/hbondpatterns/A1B3AEA.qry | 0 .../queries/hbondpatterns/A1B3AED.qry | 0 .../queries/hbondpatterns/A1B3DE1A.qry | 0 .../queries/hbondpatterns/A1B3DE1D.qry | 0 .../queries/hbondpatterns/A1B3DE3A.qry | 0 .../queries/hbondpatterns/A1B3DEA.qry | 0 .../queries/hbondpatterns/A1B3DED.qry | 0 .../queries/hbondpatterns/A1B4AEA.qry | 0 .../queries/hbondpatterns/A1B4AED.qry | 0 .../queries/hbondpatterns/A1B4DEA.qry | 0 .../queries/hbondpatterns/A1B4DED.qry | 0 .../queries/hbondpatterns/A1B6AED.qry | 0 .../queries/hbondpatterns/A1BAEA.qry | 0 .../queries/hbondpatterns/A1BDEA.qry | 0 .../queries/hbondpatterns/A1BDED.qry | 0 .../queries/hbondpatterns/A1D.qry | 0 .../queries/hbondpatterns/A1D1A.qry | 0 .../queries/hbondpatterns/A1D1D.qry | 0 .../queries/hbondpatterns/A1D2A.qry | 0 .../queries/hbondpatterns/A1D2D.qry | 0 .../queries/hbondpatterns/A1D3A.qry | 0 .../queries/hbondpatterns/A1D3D.qry | 0 .../queries/hbondpatterns/A1D4A.qry | 0 .../queries/hbondpatterns/A1D4D.qry | 0 .../queries/hbondpatterns/A1D5A.qry | 0 .../queries/hbondpatterns/A1D5D.qry | 0 .../queries/hbondpatterns/A2A.qry | 0 .../queries/hbondpatterns/A2A2A.qry | 0 .../queries/hbondpatterns/A2A2D.qry | 0 .../queries/hbondpatterns/A2A3A.qry | 0 .../queries/hbondpatterns/A2A3D.qry | 0 .../queries/hbondpatterns/A2B1AE1A.qry | 0 .../queries/hbondpatterns/A2B1DE1A.qry | 0 .../queries/hbondpatterns/A2B1DE1D.qry | 0 .../queries/hbondpatterns/A2B2AE1A.qry | 0 .../queries/hbondpatterns/A2B2AE1D.qry | 0 .../queries/hbondpatterns/A2B2DE1A.qry | 0 .../queries/hbondpatterns/A2B2DE1D.qry | 0 .../queries/hbondpatterns/A2D.qry | 0 .../queries/hbondpatterns/A2D2A.qry | 0 .../queries/hbondpatterns/A2D2D.qry | 0 .../queries/hbondpatterns/A2D3A.qry | 0 .../queries/hbondpatterns/A2D3D.qry | 0 .../queries/hbondpatterns/A2D4A.qry | 0 .../queries/hbondpatterns/A3A.qry | 0 .../queries/hbondpatterns/A3A3A.qry | 0 .../queries/hbondpatterns/A3A3D.qry | 0 .../queries/hbondpatterns/A3D.qry | 0 .../queries/hbondpatterns/A4A.qry | 0 .../queries/hbondpatterns/A4D.qry | 0 .../queries/hbondpatterns/A5A.qry | 0 .../queries/hbondpatterns/A5D.qry | 0 .../queries/hbondpatterns/A6A.qry | 0 .../queries/hbondpatterns/A6D.qry | 0 .../queries/hbondpatterns/AA.qry | 0 .../queries/hbondpatterns/AA1A.qry | 0 .../queries/hbondpatterns/AA1D.qry | 0 .../queries/hbondpatterns/AA2A.qry | 0 .../queries/hbondpatterns/AA2D.qry | 0 .../queries/hbondpatterns/AA3A.qry | 0 .../queries/hbondpatterns/AA3D.qry | 0 .../queries/hbondpatterns/AA4A.qry | 0 .../queries/hbondpatterns/AA4D.qry | 0 .../queries/hbondpatterns/AA5A.qry | 0 .../queries/hbondpatterns/AA5D.qry | 0 .../queries/hbondpatterns/AAA.qry | 0 .../queries/hbondpatterns/AAD.qry | 0 .../queries/hbondpatterns/AD.qry | 0 .../queries/hbondpatterns/AD1A.qry | 0 .../queries/hbondpatterns/AD1D.qry | 0 .../queries/hbondpatterns/AD2A.qry | 0 .../queries/hbondpatterns/AD2D.qry | 0 .../queries/hbondpatterns/AD3A.qry | 0 .../queries/hbondpatterns/AD3D.qry | 0 .../queries/hbondpatterns/AD4A.qry | 0 .../queries/hbondpatterns/AD4D.qry | 0 .../queries/hbondpatterns/AD5A.qry | 0 .../queries/hbondpatterns/AD5D.qry | 0 .../queries/hbondpatterns/ADA.qry | 0 .../queries/hbondpatterns/ADD.qry | 0 .../data => data}/queries/hbondpatterns/D.qry | 0 .../queries/hbondpatterns/D1A1D.qry | 0 .../queries/hbondpatterns/D1A2A.qry | 0 .../queries/hbondpatterns/D1A2D.qry | 0 .../queries/hbondpatterns/D1A3A.qry | 0 .../queries/hbondpatterns/D1A3D.qry | 0 .../queries/hbondpatterns/D1A4A.qry | 0 .../queries/hbondpatterns/D1A4D.qry | 0 .../queries/hbondpatterns/D1B1AE1A.qry | 0 .../queries/hbondpatterns/D1B1AED.qry | 0 .../queries/hbondpatterns/D1B1DE1A.qry | 0 .../queries/hbondpatterns/D1B1DE1D.qry | 0 .../queries/hbondpatterns/D1B1DED.qry | 0 .../queries/hbondpatterns/D1B2AE1A.qry | 0 .../queries/hbondpatterns/D1B2AE1D.qry | 0 .../queries/hbondpatterns/D1B2AE2A.qry | 0 .../queries/hbondpatterns/D1B2AED.qry | 0 .../queries/hbondpatterns/D1B2DE1A.qry | 0 .../queries/hbondpatterns/D1B2DE1D.qry | 0 .../queries/hbondpatterns/D1B2DE2A.qry | 0 .../queries/hbondpatterns/D1B2DE2D.qry | 0 .../queries/hbondpatterns/D1B2DED.qry | 0 .../queries/hbondpatterns/D1B3AE1A.qry | 0 .../queries/hbondpatterns/D1B3AE1D.qry | 0 .../queries/hbondpatterns/D1B3AED.qry | 0 .../queries/hbondpatterns/D1B3DE1A.qry | 0 .../queries/hbondpatterns/D1B3DE1D.qry | 0 .../queries/hbondpatterns/D1B3DED.qry | 0 .../queries/hbondpatterns/D1B4AED.qry | 0 .../queries/hbondpatterns/D1B4DED.qry | 0 .../queries/hbondpatterns/D1BDED.qry | 0 .../queries/hbondpatterns/D1D.qry | 0 .../queries/hbondpatterns/D1D1D.qry | 0 .../queries/hbondpatterns/D1D2A.qry | 0 .../queries/hbondpatterns/D1D2D.qry | 0 .../queries/hbondpatterns/D1D3A.qry | 0 .../queries/hbondpatterns/D1D3D.qry | 0 .../queries/hbondpatterns/D1D4A.qry | 0 .../queries/hbondpatterns/D1D4D.qry | 0 .../queries/hbondpatterns/D2A2D.qry | 0 .../queries/hbondpatterns/D2A3A.qry | 0 .../queries/hbondpatterns/D2A3D.qry | 0 .../queries/hbondpatterns/D2B1DE1D.qry | 0 .../queries/hbondpatterns/D2B2AE1D.qry | 0 .../queries/hbondpatterns/D2B2DE1D.qry | 0 .../queries/hbondpatterns/D2D.qry | 0 .../queries/hbondpatterns/D2D2D.qry | 0 .../queries/hbondpatterns/D2D3A.qry | 0 .../queries/hbondpatterns/D2D3D.qry | 0 .../queries/hbondpatterns/D2D4A.qry | 0 .../queries/hbondpatterns/D3D.qry | 0 .../queries/hbondpatterns/D4D.qry | 0 .../queries/hbondpatterns/D5D.qry | 0 .../queries/hbondpatterns/D6D.qry | 0 .../queries/hbondpatterns/DA1A.qry | 0 .../queries/hbondpatterns/DA1D.qry | 0 .../queries/hbondpatterns/DA2A.qry | 0 .../queries/hbondpatterns/DA2D.qry | 0 .../queries/hbondpatterns/DA3A.qry | 0 .../queries/hbondpatterns/DA3D.qry | 0 .../queries/hbondpatterns/DA4A.qry | 0 .../queries/hbondpatterns/DA4D.qry | 0 .../queries/hbondpatterns/DA5A.qry | 0 .../queries/hbondpatterns/DA5D.qry | 0 .../queries/hbondpatterns/DAD.qry | 0 .../queries/hbondpatterns/DD.qry | 0 .../queries/hbondpatterns/DD1A.qry | 0 .../queries/hbondpatterns/DD1D.qry | 0 .../queries/hbondpatterns/DD2A.qry | 0 .../queries/hbondpatterns/DD2D.qry | 0 .../queries/hbondpatterns/DD3A.qry | 0 .../queries/hbondpatterns/DD3D.qry | 0 .../queries/hbondpatterns/DD4A.qry | 0 .../queries/hbondpatterns/DD4D.qry | 0 .../queries/hbondpatterns/DD5A.qry | 0 .../queries/hbondpatterns/DD5D.qry | 0 .../queries/hbondpatterns/DDD.qry | 0 .../queries/hbondpatterns/counta1.qry | 0 .../queries/hbondpatterns/counta10.qry | 0 .../queries/hbondpatterns/counta2.qry | 0 .../queries/hbondpatterns/counta3.qry | 0 .../queries/hbondpatterns/counta4.qry | 0 .../queries/hbondpatterns/counta5.qry | 0 .../queries/hbondpatterns/counta6.qry | 0 .../queries/hbondpatterns/counta7.qry | 0 .../queries/hbondpatterns/counta8.qry | 0 .../queries/hbondpatterns/counta9.qry | 0 .../queries/hbondpatterns/countd1.qry | 0 .../queries/hbondpatterns/countd10.qry | 0 .../queries/hbondpatterns/countd2.qry | 0 .../queries/hbondpatterns/countd3.qry | 0 .../queries/hbondpatterns/countd4.qry | 0 .../queries/hbondpatterns/countd5.qry | 0 .../queries/hbondpatterns/countd6.qry | 0 .../queries/hbondpatterns/countd7.qry | 0 .../queries/hbondpatterns/countd8.qry | 0 .../queries/hbondpatterns/countd9.qry | 0 .../data => data}/queries/hbondpatterns/nass | 0 .../queries/hbondpatterns/nass.26may00 | 0 .../queries/hbondpatterns/nass.s1 | 0 .../queries/hbondpatterns/nass.s2 | 0 .../queries/hbondpatterns/queries | 0 .../data => data}/queries/hbonds/acceptor | 0 .../data => data}/queries/hbonds/aminunch.qry | 0 .../data => data}/queries/hbonds/carbonyl.qry | 0 .../data => data}/queries/hbonds/cyano.qry | 0 .../data => data}/queries/hbonds/donor.qry | 0 .../data => data}/queries/hbonds/ether.qry | 0 .../data => data}/queries/hbonds/hydroxam.qry | 0 .../data => data}/queries/hbonds/hydroxyl.qry | 0 .../data => data}/queries/hbonds/imine.qry | 0 .../data => data}/queries/hbonds/qminus.qry | 0 .../data => data}/queries/heteroatoms/A.qry | 0 .../data => data}/queries/heteroatoms/A1A.qry | 0 .../queries/heteroatoms/A1A1A.qry | 0 .../queries/heteroatoms/A1A1D.qry | 0 .../queries/heteroatoms/A1A2A.qry | 0 .../queries/heteroatoms/A1A2D.qry | 0 .../queries/heteroatoms/A1A3A.qry | 0 .../queries/heteroatoms/A1A3D.qry | 0 .../queries/heteroatoms/A1A4A.qry | 0 .../queries/heteroatoms/A1A4D.qry | 0 .../queries/heteroatoms/A1B1AE1A.qry | 0 .../queries/heteroatoms/A1B1AEA.qry | 0 .../queries/heteroatoms/A1B1AED.qry | 0 .../queries/heteroatoms/A1B1DE1A.qry | 0 .../queries/heteroatoms/A1B1DE1D.qry | 0 .../queries/heteroatoms/A1B1DEA.qry | 0 .../queries/heteroatoms/A1B1DED.qry | 0 .../queries/heteroatoms/A1B2AE1A.qry | 0 .../queries/heteroatoms/A1B2AE1D.qry | 0 .../queries/heteroatoms/A1B2AE2A.qry | 0 .../queries/heteroatoms/A1B2AEA.qry | 0 .../queries/heteroatoms/A1B2AED.qry | 0 .../queries/heteroatoms/A1B2DE1A.qry | 0 .../queries/heteroatoms/A1B2DE1D.qry | 0 .../queries/heteroatoms/A1B2DE2A.qry | 0 .../queries/heteroatoms/A1B2DE2D.qry | 0 .../queries/heteroatoms/A1B2DEA.qry | 0 .../queries/heteroatoms/A1B2DED.qry | 0 .../queries/heteroatoms/A1B3AE1A.qry | 0 .../queries/heteroatoms/A1B3AE1D.qry | 0 .../queries/heteroatoms/A1B3AE3A.qry | 0 .../queries/heteroatoms/A1B3AEA.qry | 0 .../queries/heteroatoms/A1B3AED.qry | 0 .../queries/heteroatoms/A1B3DE1A.qry | 0 .../queries/heteroatoms/A1B3DE1D.qry | 0 .../queries/heteroatoms/A1B3DE3A.qry | 0 .../queries/heteroatoms/A1B3DEA.qry | 0 .../queries/heteroatoms/A1B3DED.qry | 0 .../queries/heteroatoms/A1B4AEA.qry | 0 .../queries/heteroatoms/A1B4AED.qry | 0 .../queries/heteroatoms/A1B4DEA.qry | 0 .../queries/heteroatoms/A1B4DED.qry | 0 .../queries/heteroatoms/A1B6AED.qry | 0 .../queries/heteroatoms/A1BAEA.qry | 0 .../queries/heteroatoms/A1BDEA.qry | 0 .../queries/heteroatoms/A1BDED.qry | 0 .../data => data}/queries/heteroatoms/A1D.qry | 0 .../queries/heteroatoms/A1D1A.qry | 0 .../queries/heteroatoms/A1D1D.qry | 0 .../queries/heteroatoms/A1D2A.qry | 0 .../queries/heteroatoms/A1D2D.qry | 0 .../queries/heteroatoms/A1D3A.qry | 0 .../queries/heteroatoms/A1D3D.qry | 0 .../queries/heteroatoms/A1D4A.qry | 0 .../queries/heteroatoms/A1D4D.qry | 0 .../queries/heteroatoms/A1D5A.qry | 0 .../queries/heteroatoms/A1D5D.qry | 0 .../data => data}/queries/heteroatoms/A2A.qry | 0 .../queries/heteroatoms/A2A2A.qry | 0 .../queries/heteroatoms/A2A2D.qry | 0 .../queries/heteroatoms/A2A3A.qry | 0 .../queries/heteroatoms/A2A3D.qry | 0 .../queries/heteroatoms/A2B1AE1A.qry | 0 .../queries/heteroatoms/A2B1DE1A.qry | 0 .../queries/heteroatoms/A2B1DE1D.qry | 0 .../queries/heteroatoms/A2B2AE1A.qry | 0 .../queries/heteroatoms/A2B2AE1D.qry | 0 .../queries/heteroatoms/A2B2DE1A.qry | 0 .../queries/heteroatoms/A2B2DE1D.qry | 0 .../data => data}/queries/heteroatoms/A2D.qry | 0 .../queries/heteroatoms/A2D2A.qry | 0 .../queries/heteroatoms/A2D2D.qry | 0 .../queries/heteroatoms/A2D3A.qry | 0 .../queries/heteroatoms/A2D3D.qry | 0 .../queries/heteroatoms/A2D4A.qry | 0 .../data => data}/queries/heteroatoms/A3A.qry | 0 .../queries/heteroatoms/A3A3A.qry | 0 .../queries/heteroatoms/A3A3D.qry | 0 .../data => data}/queries/heteroatoms/A3D.qry | 0 .../data => data}/queries/heteroatoms/A4A.qry | 0 .../data => data}/queries/heteroatoms/A4D.qry | 0 .../data => data}/queries/heteroatoms/A5A.qry | 0 .../data => data}/queries/heteroatoms/A5D.qry | 0 .../data => data}/queries/heteroatoms/A6A.qry | 0 .../data => data}/queries/heteroatoms/A6D.qry | 0 .../data => data}/queries/heteroatoms/A7A.qry | 0 .../data => data}/queries/heteroatoms/AA.qry | 0 .../queries/heteroatoms/AA1A.qry | 0 .../queries/heteroatoms/AA1D.qry | 0 .../queries/heteroatoms/AA2A.qry | 0 .../queries/heteroatoms/AA2D.qry | 0 .../queries/heteroatoms/AA3A.qry | 0 .../queries/heteroatoms/AA3D.qry | 0 .../queries/heteroatoms/AA4A.qry | 0 .../queries/heteroatoms/AA4D.qry | 0 .../queries/heteroatoms/AA5A.qry | 0 .../queries/heteroatoms/AA5D.qry | 0 .../data => data}/queries/heteroatoms/AAA.qry | 0 .../data => data}/queries/heteroatoms/AAD.qry | 0 .../data => data}/queries/heteroatoms/AD.qry | 0 .../queries/heteroatoms/AD1A.qry | 0 .../queries/heteroatoms/AD1D.qry | 0 .../queries/heteroatoms/AD2A.qry | 0 .../queries/heteroatoms/AD2D.qry | 0 .../queries/heteroatoms/AD3A.qry | 0 .../queries/heteroatoms/AD3D.qry | 0 .../queries/heteroatoms/AD4A.qry | 0 .../queries/heteroatoms/AD4D.qry | 0 .../queries/heteroatoms/AD5A.qry | 0 .../queries/heteroatoms/AD5D.qry | 0 .../data => data}/queries/heteroatoms/ADA.qry | 0 .../data => data}/queries/heteroatoms/ADD.qry | 0 .../data => data}/queries/heteroatoms/D.qry | 0 .../queries/heteroatoms/D1A1D.qry | 0 .../queries/heteroatoms/D1A2A.qry | 0 .../queries/heteroatoms/D1A2D.qry | 0 .../queries/heteroatoms/D1A3A.qry | 0 .../queries/heteroatoms/D1A3D.qry | 0 .../queries/heteroatoms/D1A4A.qry | 0 .../queries/heteroatoms/D1A4D.qry | 0 .../queries/heteroatoms/D1B1AE1A.qry | 0 .../queries/heteroatoms/D1B1AED.qry | 0 .../queries/heteroatoms/D1B1DE1A.qry | 0 .../queries/heteroatoms/D1B1DE1D.qry | 0 .../queries/heteroatoms/D1B1DED.qry | 0 .../queries/heteroatoms/D1B2AE1A.qry | 0 .../queries/heteroatoms/D1B2AE1D.qry | 0 .../queries/heteroatoms/D1B2AE2A.qry | 0 .../queries/heteroatoms/D1B2AED.qry | 0 .../queries/heteroatoms/D1B2DE1A.qry | 0 .../queries/heteroatoms/D1B2DE1D.qry | 0 .../queries/heteroatoms/D1B2DE2A.qry | 0 .../queries/heteroatoms/D1B2DE2D.qry | 0 .../queries/heteroatoms/D1B2DED.qry | 0 .../queries/heteroatoms/D1B3AE1A.qry | 0 .../queries/heteroatoms/D1B3AE1D.qry | 0 .../queries/heteroatoms/D1B3AED.qry | 0 .../queries/heteroatoms/D1B3DE1A.qry | 0 .../queries/heteroatoms/D1B3DE1D.qry | 0 .../queries/heteroatoms/D1B3DED.qry | 0 .../queries/heteroatoms/D1B4AED.qry | 0 .../queries/heteroatoms/D1B4DED.qry | 0 .../queries/heteroatoms/D1BDED.qry | 0 .../data => data}/queries/heteroatoms/D1D.qry | 0 .../queries/heteroatoms/D1D1D.qry | 0 .../queries/heteroatoms/D1D2A.qry | 0 .../queries/heteroatoms/D1D2D.qry | 0 .../queries/heteroatoms/D1D3A.qry | 0 .../queries/heteroatoms/D1D3D.qry | 0 .../queries/heteroatoms/D1D4A.qry | 0 .../queries/heteroatoms/D1D4D.qry | 0 .../queries/heteroatoms/D2A2D.qry | 0 .../queries/heteroatoms/D2A3A.qry | 0 .../queries/heteroatoms/D2A3D.qry | 0 .../queries/heteroatoms/D2B1DE1D.qry | 0 .../queries/heteroatoms/D2B2AE1D.qry | 0 .../queries/heteroatoms/D2B2DE1D.qry | 0 .../data => data}/queries/heteroatoms/D2D.qry | 0 .../queries/heteroatoms/D2D2D.qry | 0 .../queries/heteroatoms/D2D3A.qry | 0 .../queries/heteroatoms/D2D3D.qry | 0 .../queries/heteroatoms/D2D4A.qry | 0 .../data => data}/queries/heteroatoms/D3D.qry | 0 .../data => data}/queries/heteroatoms/D4D.qry | 0 .../data => data}/queries/heteroatoms/D5D.qry | 0 .../data => data}/queries/heteroatoms/D6D.qry | 0 .../queries/heteroatoms/DA1A.qry | 0 .../queries/heteroatoms/DA1D.qry | 0 .../queries/heteroatoms/DA2A.qry | 0 .../queries/heteroatoms/DA2D.qry | 0 .../queries/heteroatoms/DA3A.qry | 0 .../queries/heteroatoms/DA3D.qry | 0 .../queries/heteroatoms/DA4A.qry | 0 .../queries/heteroatoms/DA4D.qry | 0 .../queries/heteroatoms/DA5A.qry | 0 .../queries/heteroatoms/DA5D.qry | 0 .../data => data}/queries/heteroatoms/DAD.qry | 0 .../data => data}/queries/heteroatoms/DD.qry | 0 .../queries/heteroatoms/DD1A.qry | 0 .../queries/heteroatoms/DD1D.qry | 0 .../queries/heteroatoms/DD2A.qry | 0 .../queries/heteroatoms/DD2D.qry | 0 .../queries/heteroatoms/DD3A.qry | 0 .../queries/heteroatoms/DD3D.qry | 0 .../queries/heteroatoms/DD4A.qry | 0 .../queries/heteroatoms/DD4D.qry | 0 .../queries/heteroatoms/DD5A.qry | 0 .../queries/heteroatoms/DD5D.qry | 0 .../data => data}/queries/heteroatoms/DDD.qry | 0 .../queries/heteroatoms/counta1.qry | 0 .../queries/heteroatoms/counta10.qry | 0 .../queries/heteroatoms/counta2.qry | 0 .../queries/heteroatoms/counta3.qry | 0 .../queries/heteroatoms/counta4.qry | 0 .../queries/heteroatoms/counta5.qry | 0 .../queries/heteroatoms/counta6.qry | 0 .../queries/heteroatoms/counta7.qry | 0 .../queries/heteroatoms/counta8.qry | 0 .../queries/heteroatoms/counta9.qry | 0 .../queries/heteroatoms/countd1.qry | 0 .../queries/heteroatoms/countd10.qry | 0 .../queries/heteroatoms/countd2.qry | 0 .../queries/heteroatoms/countd3.qry | 0 .../queries/heteroatoms/countd4.qry | 0 .../queries/heteroatoms/countd5.qry | 0 .../queries/heteroatoms/countd6.qry | 0 .../queries/heteroatoms/countd7.qry | 0 .../queries/heteroatoms/countd8.qry | 0 .../queries/heteroatoms/countd9.qry | 0 .../queries/heteroatoms/unique_queries_tnass | 0 .../isosteres/CdoubleS2CdoubleO.correct | 0 .../queries/isosteres/CdoubleS2CdoubleO.rxn | 0 .../queries/isosteres/CdoubleS2CdoubleO.smi | 0 .../queries/isosteres/F2H.correct | 0 .../data => data}/queries/isosteres/F2H.rxn | 0 .../data => data}/queries/isosteres/F2H.smi | 0 .../isosteres/cyclopropyl2ethyl.correct | 0 .../queries/isosteres/cyclopropyl2ethyl.rxn | 0 .../queries/isosteres/cyclopropyl2ethyl.smi | 0 .../data => data}/queries/isosteres/dotest | 0 .../queries/isosteres/furyl2phenyl.rxn | 0 .../queries/isosteres/halogen2methyl.correct | 0 .../queries/isosteres/halogen2methyl.rxn | 0 .../queries/isosteres/halogen2methyl.smi | 0 .../data => data}/queries/isosteres/queries | 0 .../queries/isosteres/so22co.correct | 0 .../queries/isosteres/so22co.rxn | 0 .../queries/isosteres/so22co.smi | 0 .../queries/isosteres/so2co.correct | 0 .../data => data}/queries/isosteres/so2co.rxn | 0 .../data => data}/queries/isosteres/so2co.smi | 0 .../queries/isosteres/test_so2.smi | 0 .../isosteres/thioether2methylene.correct | 0 .../queries/isosteres/thioether2methylene.rxn | 0 .../queries/isosteres/thioether2methylene.smi | 0 .../queries/medchemrules/3_valent_halogen.qry | 0 .../queries/medchemrules/3_valent_iodine.qry | 0 .../4_valent_sulphur_2_connections.qry | 0 .../6_membered_aromatic_sulfur.qry | 0 .../queries/medchemrules/8_aminoquinoline.qry | 0 .../medchemrules/8_hydroxyquinoline.qry | 0 .../queries/medchemrules/9_aminoacridine.qry | 0 .../medchemrules/O_alkyl_hydroxylamine.qry | 0 .../queries/medchemrules/acetal_1_in_ring.qry | 0 .../queries/medchemrules/acetal_acyclic.qry | 0 .../medchemrules/acetal_both_in_ring.qry | 0 .../queries/medchemrules/acetate_ester.qry | 0 .../queries/medchemrules/acetylene.qry | 0 .../medchemrules/acetylene_heteroatom.qry | 0 .../queries/medchemrules/acid_halide.qry | 0 .../queries/medchemrules/activated_ester.qry | 0 .../medchemrules/activated_phthalimide.qry | 0 .../medchemrules/acyl_amide_acyclic.qry | 0 .../medchemrules/acyl_amide_cyclic.qry | 0 .../queries/medchemrules/acyl_arom_n.qry | 0 .../queries/medchemrules/acyl_aromatic_nn.qry | 0 .../queries/medchemrules/acyl_enol.qry | 0 .../medchemrules/acyl_hydrazone_cyclic.qry | 0 .../queries/medchemrules/acyl_hydroxamate.qry | 0 .../medchemrules/acyl_hydroxamate_2.qry | 0 .../medchemrules/acyl_hydroxamate_3.qry | 0 .../medchemrules/acyl_isoamide_aromatic.qry | 0 .../queries/medchemrules/acyl_oxime.qry | 0 .../queries/medchemrules/acyl_sulfonamide.qry | 0 .../medchemrules/acyl_thiohydroxamate.qry | 0 .../queries/medchemrules/acylated_enol.qry | 0 .../medchemrules/acylated_halo_phenol.qry | 0 .../queries/medchemrules/acylurea.qry | 0 .../queries/medchemrules/adamantane.qry | 0 .../queries/medchemrules/adamantane_sub.qry | 0 .../queries/medchemrules/aldehyde.qry | 0 .../medchemrules/alkyl_fluoride_activated.qry | 0 .../queries/medchemrules/alkyl_iodide.qry | 0 .../queries/medchemrules/alkyl_sulfite.qry | 0 .../medchemrules/alkylthio_N_aromatic.qry | 0 .../queries/medchemrules/alkyne_michael.qry | 0 .../queries/medchemrules/alkynylsulfone.qry | 0 .../queries/medchemrules/allene.qry | 0 .../queries/medchemrules/aminal_acyclic.qry | 0 .../queries/medchemrules/amino_ester.qry | 0 .../medchemrules/amino_naphthalene.qry | 0 .../aminomethyl_ketone_peptide.qry | 0 .../queries/medchemrules/aminophenol.qry | 0 .../queries/medchemrules/anhydride.qry | 0 .../queries/medchemrules/aniline_acyl_ewd.qry | 0 .../medchemrules/aniline_acyl_newd.qry | 0 .../queries/medchemrules/aniline_h_ewd.qry | 0 .../queries/medchemrules/aniline_h_newd.qry | 0 .../queries/medchemrules/aniline_no_h_ewd.qry | 0 .../medchemrules/aniline_no_h_newd.qry | 0 .../queries/medchemrules/anthra_ketone.qry | 0 .../queries/medchemrules/anthracene_het.qry | 0 .../medchemrules/anthracene_phenanthrene.qry | 0 .../queries/medchemrules/aromatic_iodide.qry | 0 .../queries/medchemrules/azapteridine.qry | 0 .../queries/medchemrules/aziridine.qry | 0 .../medchemrules/benzocyclopentenone.qry | 0 .../queries/medchemrules/beta_lactone.qry | 0 .../queries/medchemrules/biguanide.qry | 0 .../queries/medchemrules/biotin.qry | 0 .../medchemrules/bis_aryl_maleimide.qry | 0 .../queries/medchemrules/boc.qry | 0 .../queries/medchemrules/bromine.qry | 0 .../queries/medchemrules/ccl3.qry | 0 .../queries/medchemrules/cf3.qry | 0 .../queries/medchemrules/charged_halide.qry | 0 .../queries/medchemrules/chlorine.qry | 0 .../conjugated_triene_acyclic_2.qry | 0 .../queries/medchemrules/coumarin.qry | 0 .../queries/medchemrules/cplus.qry | 0 .../queries/medchemrules/crown_2_2.qry | 0 .../medchemrules/crown_2_2_acyclic.qry | 0 .../queries/medchemrules/crown_2_2_cyclic.qry | 0 .../queries/medchemrules/crown_2_3.qry | 0 .../medchemrules/crown_2_3_acyclic.qry | 0 .../queries/medchemrules/crown_2_3_cyclic.qry | 0 .../queries/medchemrules/crown_3_3.qry | 0 .../medchemrules/crown_3_3_acyclic.qry | 0 .../queries/medchemrules/crown_3_3_cyclic.qry | 0 .../queries/medchemrules/cyanine_dye.qry | 0 .../queries/medchemrules/cyano.qry | 0 .../queries/medchemrules/cyano_amine.qry | 0 .../medchemrules/cyano_methyl_amine.qry | 0 .../medchemrules/cyano_methyl_sulfide.qry | 0 .../queries/medchemrules/cyanohydrin.qry | 0 .../queries/medchemrules/cyclobutadiene.qry | 0 .../queries/medchemrules/cyclohexane.qry | 0 .../medchemrules/cyclohexane_diene.qry | 0 .../queries/medchemrules/demerits | 0 .../medchemrules/di_thio_acetal_acyclic.qry | 0 .../queries/medchemrules/diacylhydrazide.qry | 0 .../medchemrules/dialkylsulfate_cyclic.qry | 0 .../queries/medchemrules/diamidine.qry | 0 .../queries/medchemrules/diaminal_acyclic.qry | 0 .../queries/medchemrules/diazo_cyclic.qry | 0 .../queries/medchemrules/dicyanomethylene.qry | 0 .../queries/medchemrules/dienone.qry | 0 .../dihalo_vinyl_1_2_dicarbonyl.qry | 0 .../medchemrules/dihydro_124_triazine.qry | 0 .../medchemrules/dihydro_pyrrolidone.qry | 0 .../queries/medchemrules/diphosphate.qry | 0 .../queries/medchemrules/dithio_olefin.qry | 0 .../queries/medchemrules/divinyl_carbonyl.qry | 0 .../medchemrules/dna_intercalator_1.qry | 0 .../queries/medchemrules/enamine.qry | 0 .../queries/medchemrules/enamine_2.qry | 0 .../medchemrules/enol_or_vinyl_ether.qry | 0 .../queries/medchemrules/ester.qry | 0 .../queries/medchemrules/ester_thione.qry | 0 .../queries/medchemrules/f2_c_o2.qry | 0 .../medchemrules/five_connected_n_or_p.qry | 0 .../medchemrules/five_valent_nitrogen.qry | 0 .../queries/medchemrules/fluorine.qry | 0 .../medchemrules/fluoro_methyl_ketone.qry | 0 .../queries/medchemrules/fmoc.qry | 0 .../queries/medchemrules/formylated.qry | 0 .../queries/medchemrules/four_valent_s_h.qry | 0 .../medchemrules/four_valent_sulphur.qry | 0 .../queries/medchemrules/furan.qry | 0 .../fused_tetrahydroquinoline.qry | 0 .../medchemrules/half_sulfur_peroxide.qry | 0 .../queries/medchemrules/halo_imine.qry | 0 .../halo_next_to_aryl_n_w_ewg.qry | 0 .../queries/medchemrules/halo_phthalazine.qry | 0 .../queries/medchemrules/halogen_nps.qry | 0 .../medchemrules/halogen_to_oxygen.qry | 0 .../medchemrules/halogenated_aromatic.qry | 0 .../medchemrules/halomethyl_ketone.qry | 0 .../medchemrules/hemiacetal_acyclic.qry | 0 .../queries/medchemrules/het_3mem_ring.qry | 0 .../medchemrules/het_3mem_ring_fused.qry | 0 .../queries/medchemrules/hydrazide.qry | 0 .../medchemrules/hydrazide_acyclic.qry | 0 .../queries/medchemrules/hydrazide_cyclic.qry | 0 .../queries/medchemrules/hydrazone.qry | 0 .../queries/medchemrules/iminal.qry | 0 .../queries/medchemrules/imine_aromatic.qry | 0 .../queries/medchemrules/imino_oxime.qry | 0 .../queries/medchemrules/isoamide_acyclic.qry | 0 .../queries/medchemrules/isocyano.qry | 0 .../medchemrules/isodithiocarbamate.qry | 0 .../medchemrules/isolated_aromatic.qry | 0 .../medchemrules/isothiazole_carbonyl.qry | 0 .../medchemrules/isothioamide_cyclic.qry | 0 .../medchemrules/isothioamide_cyclicS.qry | 0 .../queries/medchemrules/isothiourea.qry | 0 .../medchemrules/isothiourea_sulfonamide.qry | 0 .../queries/medchemrules/keto_carbonyl.qry | 0 .../queries/medchemrules/ketoamide_cyclic.qry | 0 .../queries/medchemrules/lucifer_yellow.qry | 0 .../queries/medchemrules/mcr_queries | 0 .../queries/medchemrules/melamine.qry | 0 .../queries/medchemrules/menthol.qry | 0 .../queries/medchemrules/metanitro.qry | 0 .../medchemrules/methylene_bis_sulfone.qry | 0 .../methylene_bis_sulfone_diaryl.qry | 0 .../medchemrules/michael_demerited.qry | 0 .../queries/medchemrules/michael_rejected.qry | 0 .../queries/medchemrules/michael_thione.qry | 0 .../queries/medchemrules/multiple_nitro.qry | 0 .../medchemrules/n_double_s_double_n_ring.qry | 0 .../queries/medchemrules/n_hydroxy.qry | 0 .../queries/medchemrules/n_o_acyclic.qry | 0 .../queries/medchemrules/n_oxide.qry | 0 .../queries/medchemrules/n_s_acyclic.qry | 0 .../medchemrules/naphthalene_sulfonate.qry | 0 .../queries/medchemrules/naphthyl.qry | 0 .../queries/medchemrules/ncn.qry | 0 .../queries/medchemrules/nitro.qry | 0 .../medchemrules/nitro_alpha_hetero.qry | 0 .../medchemrules/nitro_alpha_to_halogen.qry | 0 .../medchemrules/nitro_phenol_or_aniline.qry | 0 .../medchemrules/nitromethyl_sulfone.qry | 0 .../queries/medchemrules/nitrone.qry | 0 .../queries/medchemrules/nitrosamine.qry | 0 .../queries/medchemrules/nitroso.qry | 0 .../queries/medchemrules/nitrous_ester.qry | 0 .../queries/medchemrules/nitroxide.qry | 0 .../queries/medchemrules/nitroxyl.qry | 0 .../queries/medchemrules/no_rings.qry | 0 .../queries/medchemrules/non_ring_ketal.qry | 0 .../queries/medchemrules/nso_2.qry | 0 .../queries/medchemrules/o_or_s_plus.qry | 0 .../medchemrules/orthonitropyridine.qry | 0 .../queries/medchemrules/oxime.qry | 0 .../queries/medchemrules/oxiridine.qry | 0 .../medchemrules/penicillin_cephalosporin.qry | 0 .../queries/medchemrules/perchlorate.qry | 0 .../queries/medchemrules/perimidine.qry | 0 .../queries/medchemrules/peroxide.qry | 0 .../queries/medchemrules/phenanthrene_het.qry | 0 .../medchemrules/phenol_phosphate_ester.qry | 0 .../queries/medchemrules/phenolate.qry | 0 .../phenolic_ester_or_carbamate.qry | 0 .../queries/medchemrules/phenylenediamine.qry | 0 .../queries/medchemrules/phosphate_ester.qry | 0 .../medchemrules/phosphate_ester_ian_echo.qry | 0 .../queries/medchemrules/phosphoric_acid.qry | 0 .../queries/medchemrules/phthalimide.qry | 0 .../queries/medchemrules/po4.qry | 0 .../queries/medchemrules/polyphenol.qry | 0 .../queries/medchemrules/pyridazine_dione.qry | 0 .../queries/medchemrules/pyrrole.qry | 0 .../medchemrules/pyrrole_vinylidene.qry | 0 .../data => data}/queries/medchemrules/q.tar | Bin .../queries/medchemrules/qry2json.rb | 0 .../medchemrules/quat_n_heteroatom.qry | 0 .../queries/medchemrules/quat_schiff_base.qry | 0 .../queries/medchemrules/quaternary_amine.qry | 0 .../queries/medchemrules/quaternary_aryl.qry | 0 .../queries/medchemrules/queries | 0 .../queries/medchemrules/quinone_methide.qry | 0 .../queries/medchemrules/quinone_para.qry | 0 .../queries/medchemrules/reject1 | 0 .../queries/medchemrules/reject2 | 0 .../queries/medchemrules/reverse_michael.qry | 0 .../medchemrules/reverse_michael_demerit.qry | 0 .../medchemrules/reverse_michael_quat.qry | 0 .../queries/medchemrules/rhodanine.qry | 0 .../medchemrules/ring_system_too_large.qry | 0 .../ring_system_too_large_with_aromatic.qry | 0 .../queries/medchemrules/s_4_single_bonds.qry | 0 .../queries/medchemrules/scf3.qry | 0 .../queries/medchemrules/sch2s.qry | 0 .../queries/medchemrules/schiff_base.qry | 0 .../queries/medchemrules/scscs.qry | 0 .../data => data}/queries/medchemrules/so.qry | 0 .../data => data}/queries/medchemrules/ss.qry | 0 .../queries/medchemrules/steve1.qry | 0 .../strongly_fused_ring_system.qry | 0 .../queries/medchemrules/sulfimine.qry | 0 .../sulfonamide_methylene_sulfone.qry | 0 .../queries/medchemrules/sulfonic_acid.qry | 0 .../queries/medchemrules/sulfonium.qry | 0 .../queries/medchemrules/sulfonyl_ester.qry | 0 .../queries/medchemrules/sulfonyl_halide.qry | 0 .../medchemrules/sulfonyl_hydrazone.qry | 0 .../queries/medchemrules/sulfonyl_imine.qry | 0 .../medchemrules/sulfonyl_n_aromatic_edg.qry | 0 .../medchemrules/sulfonyl_n_aromatic_nedg.qry | 0 .../queries/medchemrules/sulfonyl_urea.qry | 0 .../queries/medchemrules/sulfonylmichael.qry | 0 .../queries/medchemrules/sulfoxide_imine.qry | 0 .../queries/medchemrules/sulphur.qry | 0 .../queries/medchemrules/tbutyl.qry | 0 .../medchemrules/thio_aminal_acyclic.qry | 0 .../thio_ester_thione_acyclic.qry | 0 .../medchemrules/thio_ester_thione_cyclic.qry | 0 .../queries/medchemrules/thio_oxime.qry | 0 .../medchemrules/thioacetal_acyclic.qry | 0 .../medchemrules/thioaminal_C_cyclic.qry | 0 .../thioaminal_n_sub_cyclic_2.qry | 0 .../thioaminal_n_unsub_cyclic_2.qry | 0 .../medchemrules/thiocarbonyl_aromatic.qry | 0 .../medchemrules/thiocarbonyl_diester.qry | 0 .../queries/medchemrules/thiocyanate.qry | 0 .../queries/medchemrules/thioester.qry | 0 .../medchemrules/thioester_acyclic.qry | 0 .../thioester_acyclic_aliphatic.qry | 0 .../thioester_acyclic_aromatic.qry | 0 .../queries/medchemrules/thioester_cyclic.qry | 0 .../queries/medchemrules/thiohydrazide.qry | 0 .../queries/medchemrules/thiol.qry | 0 .../medchemrules/thiomethyl_ketone.qry | 0 .../queries/medchemrules/thione.qry | 0 .../queries/medchemrules/thione_oxide.qry | 0 .../medchemrules/thiophene_furan_n_acyl.qry | 0 .../medchemrules/thiophene_furan_nh.qry | 0 .../queries/medchemrules/thiourea.qry | 0 ...too_many_aromatic_rings_in_ring_system.qry | 0 .../medchemrules/too_many_sulfonate.qry | 0 .../queries/medchemrules/triflate.qry | 0 .../medchemrules/trifluoroacetate_ester.qry | 0 .../queries/medchemrules/trifluoroborate.qry | 0 .../queries/medchemrules/triphenylmethyl.qry | 0 .../medchemrules/trivalent_phosphorus.qry | 0 .../queries/medchemrules/tropolone.qry | 0 .../queries/medchemrules/unsat_n_plus.qry | 0 .../queries/medchemrules/vinyl_cyano_2.qry | 0 .../queries/medchemrules/vinyl_cyano_het.qry | 0 .../queries/medchemrules/vinyl_disulfide.qry | 0 .../queries/medchemrules/vinyl_disulfone.qry | 0 .../queries/medchemrules/vinyl_disulfur.qry | 0 .../queries/medchemrules/vinyl_ether.qry | 0 .../vinyl_ether_thioate_isoamide.qry | 0 .../medchemrules/vinyl_halide_2_halogens.qry | 0 .../medchemrules/vinyl_halide_3_halogens.qry | 0 .../queries/medchemrules/vinyl_nitro.qry | 0 .../queries/medchemrules/vinyl_sulfone_2.qry | 0 .../queries/medchemrules/vinyl_sulfone_3.qry | 0 .../queries/medchemrules/vinyl_sulfoxide.qry | 0 .../queries/medchemrules/vinyl_sulphide.qry | 0 .../queries/medchemrules/vinyl_thioether.qry | 0 .../polybrominated_ring.qry | 0 .../polychlorinated_ring.qry | 0 .../polychlorinated_ring_system.qry | 0 .../polyfluorinated_ring.qry | 0 .../polyhalogenated_queries.list | 0 .../polyiodinated_ring.qry | 0 .../StronglyFusedRings/strongly_fused.qry | 0 .../strongly_fused_rings.qry | 0 .../StronglyFusedRings/whatwedid | 0 .../nouglymolecules/large_ring_system.qry | 0 .../nouglymolecules/large_ring_system_3.qry | 0 .../nouglymolecules/large_ring_system_4.qry | 0 .../nouglymolecules/large_ring_system_5.qry | 0 .../nouglymolecules/large_ring_system_6.qry | 0 .../nouglymolecules/large_ring_system_7.qry | 0 .../nouglymolecules/polyfluorinated.qry | 0 .../queries/nouglymolecules/spiro.qry | 0 .../queries/nouglymolecules/spiro_sys.qry | 0 .../nouglymolecules/strongly_fused.qry | 0 .../queries/nouglymolecules/strongly_fused.s1 | 0 .../nouglymolecules/too_many_rings.qry | 0 .../queries/pharmacophore/hydrophobe2.qry | 0 .../queries/pharmacophore/pharmacophore | 0 .../queries/zof/between_rings.qry | 0 .../data => data}/queries/zof/coumarin.qry | 0 .../queries/zof/dimethyl_ring.qry | 0 .../queries/zof/disubstituted.qry | 0 {contrib/data => data}/queries/zof/ester.qry | 0 {contrib/data => data}/queries/zof/floppy.qry | 0 .../queries/zof/multiple_anilines.qry | 0 .../zof/multiple_halogen_on_one_ring.qry | 0 .../zof/multiple_large_ring_systems.qry | 0 .../queries/zof/polyhalogenated_ring.qry | 0 .../data => data}/queries/zof/pyrrole.qry | 0 .../queries/zof/reverse_coumarin.qry | 0 .../queries/zof/ring_substitution.qry | 0 .../queries/zof/strained_6arom4.qry | 0 .../queries/zof/strongly_fused_ring.qry | 0 .../queries/zof/too_much_ring_spinach.qry | 0 .../AAREADME.md | 13 + .../Fragments.rings_aliphatic.smi | 0 .../Fragments.rings_aromatic.smi | 0 .../aliphatic_ring.smi | 0 .../aromatic_attachment_fragments.smi | 0 .../aromatic_ring.smi | 0 .../double_attachment_fragments.smi | 0 .../fuse_aromatic_ring.smi | 0 .../graph_edit_changes | 0 .../random_molecular_transformations | 0 .../single_attachment_fragments.smi | 0 .../single_attachment_fragments_any_atom.smi | 0 .../aliphatic_donor_acceptor.qry | 0 .../aliphatic_ring_acceptor.qry | 0 .../aliphatic_ring_acceptor.txt | 0 .../aliphatic_ring_donor.qry | 0 .../aliphatic_ring_donor.txt | 0 .../aliphatic_ring_donor_acceptor.qry | 0 .../aliphatic_ring_donor_acceptor.txt | 0 .../aliphatic_ring_negative.qry | 0 .../aliphatic_ring_negative.txt | 0 .../aliphatic_ring_non_feature.qry | 0 .../aliphatic_ring_non_feature.txt | 0 .../aliphatic_ring_positive.qry | 0 .../aliphatic_ring_positive.txt | 0 .../aromatic_ring_acceptor.qry | 0 .../aromatic_ring_acceptor.txt | 0 .../aromatic_ring_donor.qry | 0 .../aromatic_ring_donor.txt | 0 .../aromatic_ring_donor_acceptor.qry | 0 .../aromatic_ring_donor_acceptor.txt | 0 .../aromatic_ring_negative.qry | 0 .../aromatic_ring_negative.txt | 0 .../aromatic_ring_non_feature.qry | 0 .../aromatic_ring_non_feature.txt | 0 .../aromatic_ring_positive.qry | 0 .../aromatic_ring_positive.txt | 0 .../feature_node_acceptor.txt | 0 .../feature_node_acceptor1.qry | 0 .../feature_node_acceptor2.qry | 0 .../feature_node_acceptor_nitro.qry | 0 .../feature_node_acid.qry | 0 .../feature_node_donor.txt | 0 .../feature_node_donor1.qry | 0 .../feature_node_donor2.qry | 0 .../feature_node_donor_acceptor.txt | 0 .../feature_node_donor_acceptor1.qry | 0 .../feature_node_donor_acceptor2.qry | 0 .../feature_node_negative.qry | 0 .../feature_node_negative.txt | 0 .../feature_node_positive.qry | 0 .../feature_node_positive.txt | 0 .../link_node.qry | 0 .../link_node.txt | 0 .../reduced_graph.donor_acceptor/phenyl.qry | 0 .../reduced_graph.donor_acceptor/reductions | 0 .../aliphatic_donor_acceptor.qry | 0 .../reduced_graph/aliphatic_ring_acceptor.qry | 0 .../reduced_graph/aliphatic_ring_acceptor.txt | 0 .../reduced_graph/aliphatic_ring_donor.qry | 0 .../reduced_graph/aliphatic_ring_donor.txt | 0 .../aliphatic_ring_donor_acceptor.qry | 0 .../aliphatic_ring_donor_acceptor.txt | 0 .../reduced_graph/aliphatic_ring_negative.qry | 0 .../reduced_graph/aliphatic_ring_negative.txt | 0 .../aliphatic_ring_non_feature.qry | 0 .../aliphatic_ring_non_feature.txt | 0 .../reduced_graph/aliphatic_ring_positive.qry | 0 .../reduced_graph/aliphatic_ring_positive.txt | 0 .../reduced_graph/aromatic_ring_acceptor.qry | 0 .../reduced_graph/aromatic_ring_acceptor.txt | 0 .../reduced_graph/aromatic_ring_donor.qry | 0 .../reduced_graph/aromatic_ring_donor.txt | 0 .../aromatic_ring_donor_acceptor.qry | 0 .../aromatic_ring_donor_acceptor.txt | 0 .../reduced_graph/aromatic_ring_negative.qry | 0 .../reduced_graph/aromatic_ring_negative.txt | 0 .../aromatic_ring_non_feature.qry | 0 .../aromatic_ring_non_feature.txt | 0 .../reduced_graph/aromatic_ring_positive.qry | 0 .../reduced_graph/aromatic_ring_positive.txt | 0 .../reduced_graph/feature_node_acceptor.txt | 0 .../reduced_graph/feature_node_acceptor1.qry | 0 .../reduced_graph/feature_node_acceptor2.qry | 0 .../feature_node_acceptor_nitro.qry | 0 .../reduced_graph/feature_node_acid.qry | 0 .../reduced_graph/feature_node_donor.txt | 0 .../reduced_graph/feature_node_donor1.qry | 0 .../reduced_graph/feature_node_donor2.qry | 0 .../feature_node_donor_acceptor.txt | 0 .../feature_node_donor_acceptor1.qry | 0 .../feature_node_donor_acceptor2.qry | 0 .../reduced_graph/feature_node_negative.qry | 0 .../reduced_graph/feature_node_negative.txt | 0 .../reduced_graph/feature_node_positive.qry | 0 .../reduced_graph/feature_node_positive.txt | 0 .../data => data}/reduced_graph/link_node.qry | 0 .../data => data}/reduced_graph/link_node.txt | 0 .../data => data}/reduced_graph/phenyl.qry | 0 {contrib/data => data}/reduced_graph/queries | 0 .../data => data}/reduced_graph/reductions | 0 .../ring_replacement/.rings_3notarom.smi | 0 .../.rings_3notarom3notarom.smi | 0 .../.rings_3notarom3notarom4notarom.smi | 0 .../.rings_3notarom3notarom5notarom.smi | 0 .../.rings_3notarom3notarom6notarom.smi | 0 .../.rings_3notarom3notarom7notarom.smi | 0 .../.rings_3notarom4notarom.smi | 0 .../.rings_3notarom4notarom5notarom.smi | 0 .../.rings_3notarom4notarom6isarom.smi | 0 .../.rings_3notarom4notarom6notarom.smi | 0 .../.rings_3notarom5isarom.smi | 0 .../.rings_3notarom5isarom5notarom.smi | 0 .../.rings_3notarom5isarom6notarom.smi | 0 .../.rings_3notarom5notarom.smi | 0 .../.rings_3notarom5notarom5notarom.smi | 0 .../.rings_3notarom5notarom6isarom.smi | 0 .../.rings_3notarom5notarom6notarom.smi | 0 .../.rings_3notarom5notarom7notarom.smi | 0 .../.rings_3notarom6isarom.smi | 0 .../.rings_3notarom6isarom6notarom.smi | 0 .../.rings_3notarom6isarom7notarom.smi | 0 .../.rings_3notarom6notarom.smi | 0 .../.rings_3notarom6notarom6notarom.smi | 0 .../.rings_3notarom6notarom7notarom.smi | 0 .../.rings_3notarom7notarom.smi | 0 .../ring_replacement/.rings_4isarom.smi | 0 .../.rings_4isarom5isarom.smi | 0 .../.rings_4isarom5isarom6isarom.smi | 0 .../.rings_4isarom5notarom7notarom.smi | 0 .../.rings_4isarom6isarom.smi | 0 .../.rings_4isarom6isarom6isarom.smi | 0 .../.rings_4isarom7isarom.smi | 0 .../.rings_4isarom7notarom.smi | 0 .../ring_replacement/.rings_4notarom.smi | 0 .../.rings_4notarom4notarom.smi | 0 .../.rings_4notarom4notarom4notarom.smi | 0 .../.rings_4notarom4notarom5notarom.smi | 0 .../.rings_4notarom4notarom6notarom.smi | 0 .../.rings_4notarom5isarom.smi | 0 .../.rings_4notarom5isarom5notarom.smi | 0 .../.rings_4notarom5isarom6isarom.smi | 0 .../.rings_4notarom5isarom6notarom.smi | 0 .../.rings_4notarom5isarom7notarom.smi | 0 .../.rings_4notarom5notarom.smi | 0 .../.rings_4notarom5notarom5notarom.smi | 0 .../.rings_4notarom5notarom6isarom.smi | 0 .../.rings_4notarom5notarom6notarom.smi | 0 .../.rings_4notarom5notarom7notarom.smi | 0 .../.rings_4notarom6isarom.smi | 0 .../.rings_4notarom6isarom6isarom.smi | 0 .../.rings_4notarom6isarom6notarom.smi | 0 .../.rings_4notarom6isarom7notarom.smi | 0 .../.rings_4notarom6notarom.smi | 0 .../.rings_4notarom6notarom6notarom.smi | 0 .../.rings_4notarom6notarom7notarom.smi | 0 .../.rings_4notarom7notarom.smi | 0 .../.rings_4notarom7notarom7notarom.smi | 0 .../ring_replacement/.rings_5isarom.smi | 0 .../.rings_5isarom5isarom.smi | 0 .../.rings_5isarom5isarom5isarom.smi | 0 .../.rings_5isarom5isarom5notarom.smi | 0 .../.rings_5isarom5isarom6isarom.smi | 0 .../.rings_5isarom5isarom6notarom.smi | 0 .../.rings_5isarom5isarom7isarom.smi | 0 .../.rings_5isarom5isarom7notarom.smi | 0 .../.rings_5isarom5notarom.smi | 0 .../.rings_5isarom5notarom5notarom.smi | 0 .../.rings_5isarom5notarom6isarom.smi | 0 .../.rings_5isarom5notarom6notarom.smi | 0 .../.rings_5isarom5notarom7isarom.smi | 0 .../.rings_5isarom5notarom7notarom.smi | 0 .../.rings_5isarom6isarom.smi | 0 .../.rings_5isarom6isarom6isarom.smi | 0 .../.rings_5isarom6isarom6notarom.smi | 0 .../.rings_5isarom6isarom7isarom.smi | 0 .../.rings_5isarom6isarom7notarom.smi | 0 .../.rings_5isarom6notarom.smi | 0 .../.rings_5isarom6notarom6notarom.smi | 0 .../.rings_5isarom6notarom7isarom.smi | 0 .../.rings_5isarom6notarom7notarom.smi | 0 .../.rings_5isarom7isarom.smi | 0 .../.rings_5isarom7notarom.smi | 0 .../.rings_5isarom7notarom7notarom.smi | 0 .../ring_replacement/.rings_5notarom.smi | 0 .../.rings_5notarom5notarom.smi | 0 .../.rings_5notarom5notarom5notarom.smi | 0 .../.rings_5notarom5notarom6isarom.smi | 0 .../.rings_5notarom5notarom6notarom.smi | 0 .../.rings_5notarom5notarom7isarom.smi | 0 .../.rings_5notarom5notarom7notarom.smi | 0 .../.rings_5notarom6isarom.smi | 0 .../.rings_5notarom6isarom6isarom.smi | 0 .../.rings_5notarom6isarom6notarom.smi | 0 .../.rings_5notarom6isarom7notarom.smi | 0 .../.rings_5notarom6notarom.smi | 0 .../.rings_5notarom6notarom6notarom.smi | 0 .../.rings_5notarom6notarom7isarom.smi | 0 .../.rings_5notarom6notarom7notarom.smi | 0 .../.rings_5notarom7isarom.smi | 0 .../.rings_5notarom7notarom.smi | 0 .../.rings_5notarom7notarom7notarom.smi | 0 .../ring_replacement/.rings_6isarom.smi | 0 .../.rings_6isarom6isarom.smi | 0 .../.rings_6isarom6isarom6isarom.smi | 0 .../.rings_6isarom6isarom6notarom.smi | 0 .../.rings_6isarom6isarom7isarom.smi | 0 .../.rings_6isarom6isarom7notarom.smi | 0 .../.rings_6isarom6notarom.smi | 0 .../.rings_6isarom6notarom6notarom.smi | 0 .../.rings_6isarom6notarom7isarom.smi | 0 .../.rings_6isarom6notarom7notarom.smi | 0 .../.rings_6isarom7isarom.smi | 0 .../.rings_6isarom7isarom7notarom.smi | 0 .../.rings_6isarom7notarom.smi | 0 .../.rings_6isarom7notarom7notarom.smi | 0 .../ring_replacement/.rings_6notarom.smi | 0 .../.rings_6notarom6notarom.smi | 0 .../.rings_6notarom6notarom6notarom.smi | 0 .../.rings_6notarom6notarom7isarom.smi | 0 .../.rings_6notarom6notarom7notarom.smi | 0 .../.rings_6notarom7isarom.smi | 0 .../.rings_6notarom7isarom7isarom.smi | 0 .../.rings_6notarom7isarom7notarom.smi | 0 .../.rings_6notarom7notarom.smi | 0 .../.rings_6notarom7notarom7notarom.smi | 0 .../ring_replacement/.rings_7isarom.smi | 0 .../.rings_7isarom7notarom.smi | 0 .../ring_replacement/.rings_7notarom.smi | 0 .../.rings_7notarom7notarom.smi | 0 .../data => data}/ring_replacement/README.md | 0 .../ring_replacement/aggregate_rings.rb | 0 .../ring_replacement/to_hidden.sh | 0 .../ring_replacement/to_linux.sh | 0 .../data => data}/ring_replacement/to_mac.sh | 0 .../data => data}/smiles_mutation_library | 0 data/zof/between_rings.qry | 6 + data/zof/coumarin.qry | 71 + data/zof/dimethyl_ring.qry | 8 + data/zof/disubstituted.qry | 9 + data/zof/ester.qry | 14 + data/zof/floppy.qry | 5 + data/zof/multiple_anilines.qry | 8 + data/zof/multiple_halogen_on_one_ring.qry | 8 + data/zof/multiple_large_ring_systems.qry | 8 + data/zof/polyhalogenated_ring.qry | 6 + data/zof/pyrrole.qry | 13 + data/zof/reverse_coumarin.qry | 5 + data/zof/ring_substitution.qry | 7 + data/zof/strained_6arom4.qry | 6 + data/zof/strongly_fused_ring.qry | 4 + data/zof/too_much_ring_spinach.qry | 7 + docker-compose.yml | 4 +- docs/Molecule_Lib/substructure.md | 6 + docs/Molecule_Tools/trxn.md | 16 + docs/python/LillyMolPython.md | 59 +- src/.bazelrc | 10 +- src/{Utilities => }/BerkeleyDB/BUILD | 17 + .../enough_inventory_bdb.cc | 0 src/{Utilities => }/BerkeleyDB/iwbdb_cat.cc | 0 .../BerkeleyDB/iwbdb_compare.cc | 5 +- .../BerkeleyDB/iwbdb_delete.cc | 0 .../BerkeleyDB/iwbdb_exists.cc | 0 src/{Utilities => }/BerkeleyDB/iwbdb_fetch.cc | 0 .../BerkeleyDB/iwbdb_from_tdt.cc | 0 src/{Utilities => }/BerkeleyDB/iwbdb_list.cc | 0 src/{Utilities => }/BerkeleyDB/iwbdb_load.cc | 0 .../BerkeleyDB/iwbdb_merge_into_tdt.cc | 0 src/{Utilities => }/BerkeleyDB/unpack_data.cc | 0 src/{Utilities => }/BerkeleyDB/unpack_data.h | 0 src/CMakeLists.txt | 4 +- src/Dockerfile | 136 - src/Foundational/iwaray/iwaray.h | 2 + src/Foundational/iwmisc/minmaxspc.h | 7 +- src/Foundational/iwmisc/proto_support.h | 22 + src/Foundational/iwstring/IWString_class.cc | 8 +- src/Foundational/iwstring/iwstring.h | 1 + src/Foundational/iwstring/iwstring_test.cc | 9 +- src/Makefile | 84 - src/Molecule_Lib/BUILD | 55 + src/Molecule_Lib/atom.h | 2 + src/Molecule_Lib/atom_pair_fingerprint.h | 7 +- src/Molecule_Lib/atom_typing.h | 3 + src/Molecule_Lib/bond.h | 4 +- src/Molecule_Lib/charge_assigner.h | 7 +- src/Molecule_Lib/chiral_centre.h | 4 +- src/Molecule_Lib/donor_acceptor.h | 4 + src/Molecule_Lib/element.cc | 8 +- src/Molecule_Lib/element.h | 2 + src/Molecule_Lib/element_hits_needed.cc | 16 +- src/Molecule_Lib/geometric_constraints.h | 5 + src/Molecule_Lib/iwmfingerprint.h | 2 + src/Molecule_Lib/iwreaction.h | 6 + src/Molecule_Lib/iwstandard.h | 509 ---- src/Molecule_Lib/iwsubstructure.cc | 8 + src/Molecule_Lib/marvin.h | 4 + src/Molecule_Lib/mdl.h | 4 + src/Molecule_Lib/molecule.h | 12 +- src/Molecule_Lib/pearlman.h | 3 + src/Molecule_Lib/qry_wstats.h | 6 + src/Molecule_Lib/rmele.h | 3 + src/Molecule_Lib/rwmolecule.cc | 20 +- src/Molecule_Lib/rwsubstructure.h | 46 +- src/Molecule_Lib/rwsubstructure_proto.cc | 114 + src/Molecule_Lib/smiles.h | 4 + src/Molecule_Lib/standardise.h | 5 +- src/Molecule_Lib/substructure.h | 56 +- src/Molecule_Lib/substructure.proto | 45 +- src/Molecule_Lib/substructure_nmab.cc | 108 + src/Molecule_Lib/substructure_nmab_test.cc | 267 ++ src/Molecule_Lib/substructure_spec.cc | 45 +- src/Molecule_Lib/temp_detach_atoms.h | 4 + src/Molecule_Tools/BUILD | 228 +- src/Molecule_Tools/maccskeys_fn5.cc | 3 + src/Molecule_Tools/marvin_pka.cc | 1 - src/Molecule_Tools/ring_extraction.cc | 37 + src/Molecule_Tools/tp1_summarise.cc | 1 + src/Molecule_Tools/trxn.cc | 130 +- src/Molecule_Tools/unique_molecules_api.cc | 131 + src/Molecule_Tools/unique_molecules_api.h | 86 + src/Molecule_Tools/xlogp_main.cc | 2 +- src/Molecule_Tools_Bdb/BUILD | 187 ++ .../buildsmidb_bdb.cc | 55 +- .../dicer_fragment_lookup_bdb.cc | 0 .../in_database_bdb.cc | 0 .../in_lilly_database_bdb.cc | 0 .../iwecfp_database.cc | 0 .../iwecfp_database.h | 0 .../iwecfp_database_load.cc | 0 .../iwecfp_database_lookup.cc | 0 .../smi2rings.proto | 0 .../smi2rings_bdb.cc | 2 +- .../storage_conditions.cc | 0 .../storage_conditions.h | 0 .../substituent_identification.cc | 0 src/Utilities/Distance_Matrix/Makefile | 116 - src/Utilities/GFP_Tools/BUILD | 35 +- src/Utilities/GFP_Tools/Enrichment.h | 1 + src/Utilities/GFP_Tools/Makefile | 319 --- src/Utilities/GFP_Tools/gfp.cc | 2 + .../GFP_Tools/gfp_collection_fingerprint.cc | 580 +++++ src/Utilities/GFP_Tools/gfp_to_collection.cc | 286 +++ src/Utilities/GFP_Tools/iwstats.cc | 2206 ++++++++--------- src/Utilities/General/BUILD | 17 - src/Utilities/General/Makefile | 201 -- src/Utilities/General/average.cc | 2 +- .../General/descriptor_file_to_svm_lite.cc | 23 +- src/Utilities/General/notenoughvariance.cc | 5 +- src/Utilities/General/running_average.cc | 8 - src/Utilities/General/shuffle_file.cc | 2 - src/Utilities/General/stratified_samples.cc | 4 +- src/Utilities/Makefile | 102 - src/Vendor/AAReadme.md | 10 + src/WORKSPACE | 4 +- src/build_from_src.sh | 106 +- src/build_third_party.sh | 160 +- src/copy_shared_libraries.sh | 23 +- src/pybind/BUILD | 25 + src/pybind/lillymol_io_test.py | 2 + src/pybind/lillymol_pybind.cc | 29 + src/pybind/lillymol_pybind_query.cc | 25 +- src/pybind/lillymol_pybind_tools.cc | 8 + src/pybind/lillymol_unique_molecules_test.py | 95 + src/run_python.sh | 15 + src/run_python_unit_tests.sh | 21 + src/update_python_in_workspace.py | 77 + test/abraham/case_1/run_case.sh | 2 +- test/dbf/case_1/run_case.sh | 2 +- test/getMMPStatsfromCSV/case_5/run_case.sh | 2 +- test/getMMPfromSMI/case_2/test_data_01.log | 306 --- test/iwdescr/case_1/run_case.sh | 2 +- test/ring_extraction/case_1/out/ring_5Al.smi | 4 +- test/ring_extraction/case_1/out/ring_5Ar.smi | 14 +- .../case_1/out/ring_5Ar6Ar.smi | 4 +- .../case_1/out/ring_5Ar6Ar6Al.smi | 2 +- test/ring_extraction/case_1/out/ring_6Al.smi | 8 +- test/ring_extraction/case_1/out/ring_6Ar.smi | 14 +- test/ring_extraction/case_1/run_case.sh | 10 +- test/run_all_test.sh | 25 +- test/smiles_mutation/case_1/run_case.sh | 10 +- test/tnass/case_1/run_case.sh | 2 +- 1766 files changed, 8851 insertions(+), 5144 deletions(-) create mode 100644 Makefile delete mode 100644 README_OSX.md delete mode 100644 RELEASE_NOTES delete mode 100644 contrib/README create mode 100644 contrib/README.md rename contrib/{script/sh => bin}/abr.sh (55%) create mode 100755 contrib/bin/ap.sh create mode 100755 contrib/bin/assign_donor_acceptor.sh create mode 100755 contrib/bin/assign_formal_charges.sh rename contrib/{script/ruby => bin}/confusion_matrix.rb (100%) rename contrib/{script/py => bin}/dicer_fragments_collate.py (100%) rename contrib/{script/ruby => bin}/dopattern.rb (100%) rename contrib/{script/sh => bin}/dopattern.sh (100%) rename contrib/{script/ruby => bin}/fragment_filter.rb (99%) rename contrib/{script/sh => bin}/gfp_erg.sh (64%) rename contrib/{script/perl => bin}/gfp_make.pl (100%) rename contrib/{script/sh => bin}/ghose_crippen.sh (51%) create mode 100755 contrib/bin/iwdescr.sh rename contrib/{script/ruby => bin}/iwqb.rb (97%) create mode 100755 contrib/bin/jwcats.sh rename contrib/{script/sh => bin}/jwdist.sh (67%) create mode 100755 contrib/bin/medchem_wizard.sh rename contrib/{script/py => bin}/mkbenzene.py (100%) rename contrib/{script/sh => bin}/pubchem_fingerprints.sh (51%) create mode 100755 contrib/bin/random_molecular_permutations.sh rename contrib/{script/py => bin}/rdkitfp2gfp.py (100%) rename contrib/{script/py => bin}/smiles2png.py (100%) rename contrib/{script/ruby => bin}/svmfp_summarise_results.rb (100%) rename contrib/{script/ruby => bin}/vf_main.rb (100%) rename contrib/{script/ruby => bin}/vf_record_selector.rb (100%) rename contrib/{script/sh => bin}/zof.sh (89%) delete mode 100755 contrib/data/AtomicPhysChemParameter/wildman_crippen.dat delete mode 100644 contrib/data/DEL/AnnotationQueries/data delete mode 100644 contrib/script/README delete mode 100755 contrib/script/ruby/lib/iwcmdline.rb delete mode 100755 contrib/script/sh/ap.sh delete mode 100755 contrib/script/sh/iwdescr.sh delete mode 100755 contrib/script/sh/jwcats.sh create mode 100644 data/AAREADME create mode 100644 data/LillyMedchemRules/#vinyl_halide_2_halogens.qry# create mode 100644 data/MedchemWizard/Acid_isosteres..rxn create mode 100644 data/MedchemWizard/Acid_isosteres.1.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.10.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.11.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.12.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.13.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.14.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.15.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.16.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.17.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.18.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.19.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.2.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.20.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.21.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.22.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.23.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.24.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.25.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.26.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.27.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.28.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.29.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.3.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.30.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.31.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.32.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.33.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.34.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.35.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.36.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.37.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.38.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.39.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.4.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.40.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.41.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.42.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.43.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.44.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.45.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.46.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.5.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.6.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.7.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.8.rxn create mode 100644 data/MedchemWizard/Acid_isosteres.9.rxn create mode 100755 data/MedchemWizard/Acid_isosteres.rb create mode 100644 data/MedchemWizard/Aryl_group_addition.add_2-pyridyl.rxn create mode 100644 data/MedchemWizard/Aryl_group_addition.add_3-pyridyl.rxn create mode 100644 data/MedchemWizard/Aryl_group_addition.add_4-pyridyl.rxn create mode 100644 data/MedchemWizard/Aryl_group_addition.add_benzyl.rxn create mode 100644 data/MedchemWizard/Aryl_group_addition.add_phenyl.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_Br.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_Cl.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_F.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_Me.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_acetamido.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_carbamoyl.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_carboxylate.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_ethoxy.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_hydroxy.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_hydroxymethyl.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_methoxy.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_methylketone.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_methylsulfone.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_methylsulfoxide.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_nitrile.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_nitrogen.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_sulfonamide.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_t-butyl.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_trifluoromethoxy.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_trifluromethyl.rxn create mode 100644 data/MedchemWizard/Aryl_substituent_Scan.add_urea.rxn create mode 100755 data/MedchemWizard/Aryl_substituent_Scan.rb create mode 100644 data/MedchemWizard/Ester-amide_isosteres..rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.1-3-4_oxadiazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.2_pyrazine.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_1-2-3_triazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_1-2-4_oxadiazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_1-2-4_triazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_1-trifluoromethyl.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_cyclopropylamine.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_fluorovinyl.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_oxetane.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_oxetane_ether.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres._T_sulfonamide.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.amidine.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.amino-1-3-4-_oxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.amino_1-2-4-oxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.amino_oxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.cyano_oxime.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.isomeric_amino-1-3-4-_oxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.isomeric_reversed_amino-1-3-4-_oxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.isoxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.pyrazine.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.reverse_1-3-4_oxadiazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.reverse_amidine.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.reverse_amino_oxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.reverse_cyano_oxime.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.reverse_tetrazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.reverse_triazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.reversed_amino-1-2-4-oxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.reversed_amino-1-3-4-_oxazole.rxn create mode 100644 data/MedchemWizard/Ester-amide_isosteres.tetrazole.rxn create mode 100755 data/MedchemWizard/MedChemWizard_reactions.txt create mode 100644 data/MedchemWizard/Metabolism.Benzylic_oxidation.rxn create mode 100644 data/MedchemWizard/Metabolism.Benzylic_substitution.rxn create mode 100644 data/MedchemWizard/Metabolism.Benzylic_substitution_C1.rxn create mode 100644 data/MedchemWizard/Metabolism.Benzylic_substitution_C2.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_Br.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_C.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_Cl.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_F.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_Br.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_C.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_Cl.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_F.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_Br.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_C.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_Cl.rxn create mode 100644 data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_F.rxn create mode 100644 data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol.rxn create mode 100644 data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_C1.rxn create mode 100644 data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_C2.rxn create mode 100644 data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_Cl1.rxn create mode 100644 data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_Cl2.rxn create mode 100644 data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_F1.rxn create mode 100644 data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_F2.rxn create mode 100644 data/MedchemWizard/Metabolism.Catechol_T_methylenedioxy.rxn create mode 100644 data/MedchemWizard/Metabolism.OEt_T_OCH2CF3.rxn create mode 100644 data/MedchemWizard/Metabolism.OEt_T_OcPr.rxn create mode 100644 data/MedchemWizard/Metabolism.OH_T_OCF3.rxn create mode 100644 data/MedchemWizard/Metabolism.OH_T_OCH2F.rxn create mode 100644 data/MedchemWizard/Metabolism.OH_T_OCHF2.rxn create mode 100644 data/MedchemWizard/Metabolism.OH_T_OMe.rxn create mode 100644 data/MedchemWizard/Metabolism.OMe_T_OCF3.rxn create mode 100644 data/MedchemWizard/Metabolism.OMe_T_OCH2F.rxn create mode 100644 data/MedchemWizard/Metabolism.OMe_T_OCHF2.rxn create mode 100644 data/MedchemWizard/Metabolism.OMe_T_OEt.rxn create mode 100644 data/MedchemWizard/Metabolism.OMe_T_OPr.rxn create mode 100644 data/MedchemWizard/Metabolism.OMe_T_OcPr.rxn create mode 100644 data/MedchemWizard/Metabolism.OMe_T_OiPr.rxn create mode 100644 data/MedchemWizard/Metabolism.Phenol_T_hydroxymethyl.rxn create mode 100644 data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-Cl.rxn create mode 100644 data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-F.rxn create mode 100644 data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-Me.rxn create mode 100644 data/MedchemWizard/Metabolism.acetylene_T_ether.rxn create mode 100644 data/MedchemWizard/Metabolism.alkene_T_alkane.rxn create mode 100644 data/MedchemWizard/Metabolism.alkene_T_cyclopropyl.rxn create mode 100644 data/MedchemWizard/Metabolism.alkene_T_ether.rxn create mode 100644 data/MedchemWizard/Metabolism.methyl_T_hydroxymethyl.rxn create mode 100644 data/MedchemWizard/Metabolism.pyridyl_T_2-6-dimethylpyridyl.rxn create mode 100644 data/MedchemWizard/Metabolism.pyridyl_T_2-methyl_pyridyl.rxn create mode 100644 data/MedchemWizard/Metabolism.pyridyl_T_N-oxide.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.1-4-phenyl_T_2.2.2_tricycle.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.aryl_C_T_aryl_N.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.aryl_n_T_aryl_c.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.ccn_T_ncc.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.cn_T_nc.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.cn_T_nn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.furan_T_phenyl.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.indole_T_indazole.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.indole_T_indolizine.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nH_T_O.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nH_T_s.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.ncc_T_ncn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.ncc_T_nnc.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nccn_T_ncccn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nccn_T_ncnc.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.ncn_T_nccn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nn_T_ncn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nnnc_T_nncn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nocn_T_nonc.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nonc_T_nocn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.nscn_T_nsnc.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.o_T_NH.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.o_T_s.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.ocn_T_onc.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.onc_T_ocn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_--_isoquinolinyl.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_benzimidazole.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_cinnoline.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_furan.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_indole.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_naphthyl.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_phthalazine.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_quinazoline.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_quinolinyl.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_quinoxaline.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.phenyl_T_thiophene.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.pyrrole_T_indole.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.pyrrole_T_isoindole.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.pyrrole_T_phenyl.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.s_T_NH.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.s_T_o.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.scn_T_snc.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.snc_T_scn.rxn create mode 100644 data/MedchemWizard/More_aryl_rings.thiophene_T_phenyl.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.N-Me_urea.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.Urea.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.acetamide.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.benzimidazole.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.benzotriazole.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.hydroxymethyl.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.imidazolone.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.indazole.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.indole.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.isatin.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.oxindole.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.sulfamide.rxn create mode 100644 data/MedchemWizard/Phenol_isosteres.sulfonamide.rxn create mode 100644 data/MedchemWizard/REACTIONS create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_2,2-dimethylethanol.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_CH2-CO2H.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_CH2-NH-CH2-CH2-methylsulfone.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_F.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_N,N-dimethylethanolamine.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_N,N-dimethylpropanolamine.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_N-Me_piperazine.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_O-CH2-CH2-pyrrolidine.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_acetamide.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_amino.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_carbamoyl.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_carboxylate.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_dimethyl.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_ethyl.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_hydroxy.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_hydroxyethyl.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_hydroxymethyl.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_methyl.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_morpholinyl.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_sulfonamide.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_sulfone.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.add_t-butyl.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.amine_to_N-Ac.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.amine_to_N-Me.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.amine_to_N-Me2.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.amine_to_carbamate.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.amine_to_urea.rxn create mode 100644 data/MedchemWizard/Simple_H_Replacement.nitrogen_to_oxygen.rxn create mode 100755 data/MedchemWizard/Simple_H_Replacements.rb create mode 100644 data/MedchemWizard/Switches.reverse_amide.rxn create mode 100644 data/MedchemWizard/Switches.reverse_sulfonamide.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_5-_ring_to_form_pseudoring.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_5-ring_to_form_pseudoring.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_6-ring_to_form_pseudoring.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_1.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_3.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_4.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_1.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_3.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cyclopentyl_1.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.break_open_a_cyclopentyl_2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_-O-CH2-CH2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-CH2-O.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-CH2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-N-CH2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-O-CH2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-O.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-S-CH2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-S.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_O-CH2.rxn create mode 100644 data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_S-CH2.rxn create mode 100755 data/MedchemWizard/make_reactions.rb rename {contrib/data => data}/abraham_hbond_constants (100%) rename {contrib/data => data}/chembl.ranges (100%) create mode 100644 data/pubchem_fingerprints/AAREADME.md rename {contrib/data => data}/pubchem_fingerprints/section4.smt (100%) rename {contrib/data => data}/pubchem_fingerprints/section5.smt (100%) rename {contrib/data => data}/pubchem_fingerprints/section6.smt (100%) rename {contrib/data => data}/pubchem_fingerprints/section7.smt (100%) rename {contrib/data => data}/queries/PAINS/amino_acridine_A.qry (100%) rename {contrib/data => data}/queries/PAINS/anil_alk_ene.qry (100%) rename {contrib/data => data}/queries/PAINS/anil_di_alk_A.qry (100%) rename {contrib/data => data}/queries/PAINS/anil_di_alk_B.qry (100%) rename {contrib/data => data}/queries/PAINS/anil_di_alk_C.qry (100%) rename {contrib/data => data}/queries/PAINS/anil_di_alk_D.qry (100%) rename {contrib/data => data}/queries/PAINS/anil_di_alk_E.qry (100%) rename {contrib/data => data}/queries/PAINS/anil_no_alk.qry (100%) rename {contrib/data => data}/queries/PAINS/anthranil_acid_A.qry (100%) rename {contrib/data => data}/queries/PAINS/anthranil_one_A.qry (100%) rename {contrib/data => data}/queries/PAINS/azo_A.qry (100%) rename {contrib/data => data}/queries/PAINS/catechol_A.qry (100%) rename {contrib/data => data}/queries/PAINS/cyano_ene_amine_A.qry (100%) rename {contrib/data => data}/queries/PAINS/cyano_imine_A.qry (100%) rename {contrib/data => data}/queries/PAINS/cyano_imine_B.qry (100%) rename {contrib/data => data}/queries/PAINS/cyano_pyridone_A.qry (100%) rename {contrib/data => data}/queries/PAINS/cyano_pyridone_B.qry (100%) rename {contrib/data => data}/queries/PAINS/dhp_bis_amino_CN.qry (100%) rename {contrib/data => data}/queries/PAINS/diazox_sulfon_A.qry (100%) rename {contrib/data => data}/queries/PAINS/dyes3A.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_cyano_A.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_five_het_A.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_five_het_B.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_five_het_C.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_five_het_E.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_five_het_F.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_five_one_A.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_one_ene_A.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_one_ester.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_one_hal.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_rhod_A.qry (100%) rename {contrib/data => data}/queries/PAINS/ene_six_het_A.qry (100%) rename {contrib/data => data}/queries/PAINS/het_65_A.qry (100%) rename {contrib/data => data}/queries/PAINS/het_6_tetrazine.qry (100%) rename {contrib/data => data}/queries/PAINS/het_pyridiniums_A.qry (100%) rename {contrib/data => data}/queries/PAINS/hzone_acyl_naphthol.qry (100%) rename {contrib/data => data}/queries/PAINS/hzone_anil_di_alk.qry (100%) rename {contrib/data => data}/queries/PAINS/hzone_enamin.qry (100%) rename {contrib/data => data}/queries/PAINS/hzone_phenol_A.qry (100%) rename {contrib/data => data}/queries/PAINS/hzone_phenol_B.qry (100%) rename {contrib/data => data}/queries/PAINS/hzone_pipzn.qry (100%) rename {contrib/data => data}/queries/PAINS/imidazole_A.qry (100%) rename {contrib/data => data}/queries/PAINS/imine_one_A.qry (100%) rename {contrib/data => data}/queries/PAINS/imine_one_fives.qry (100%) rename {contrib/data => data}/queries/PAINS/imine_one_isatin.qry (100%) rename {contrib/data => data}/queries/PAINS/indol_3yl_alk.qry (100%) rename {contrib/data => data}/queries/PAINS/keto_keto_beta_A.qry (100%) rename {contrib/data => data}/queries/PAINS/mannich_A.qry (100%) rename {contrib/data => data}/queries/PAINS/naphth_amino_A.qry (100%) rename {contrib/data => data}/queries/PAINS/naphth_amino_B.qry (100%) rename {contrib/data => data}/queries/PAINS/pyrrole_A.qry (100%) rename {contrib/data => data}/queries/PAINS/pyrrole_B.qry (100%) rename {contrib/data => data}/queries/PAINS/queries_latest (100%) rename {contrib/data => data}/queries/PAINS/quinone_A.qry (100%) rename {contrib/data => data}/queries/PAINS/rhod_sat_A.qry (100%) rename {contrib/data => data}/queries/PAINS/sulfonamide_A.qry (100%) rename {contrib/data => data}/queries/PAINS/sulfonamide_B.qry (100%) rename {contrib/data => data}/queries/PAINS/thiaz_ene_A.qry (100%) rename {contrib/data => data}/queries/PAINS/thiaz_ene_B.qry (100%) rename {contrib/data => data}/queries/PAINS/thio_carbonate_A.qry (100%) rename {contrib/data => data}/queries/PAINS/thio_dibenzo.qry (100%) rename {contrib/data => data}/queries/PAINS/thiophene_amino_Aa.qry (100%) rename {contrib/data => data}/queries/PAINS/thiophene_amino_Ab.qry (100%) rename {contrib/data => data}/queries/PAINS/thiophene_hydroxy.qry (100%) rename {contrib/data => data}/queries/abraham/Abraham (100%) rename {contrib/data => data}/queries/abraham/Alpha2H (100%) rename {contrib/data => data}/queries/abraham/ConstantinouGani.Table1 (100%) rename {contrib/data => data}/queries/abraham/ConstantinouGani.Table13 (100%) rename {contrib/data => data}/queries/abraham/ConstantinouGani.Table13.First (100%) rename {contrib/data => data}/queries/abraham/ConstantinouGani.Table2 (100%) rename {contrib/data => data}/queries/abraham/ConstantinouGani.Table24 (100%) rename {contrib/data => data}/queries/abraham/ConstantinouGani.Table3 (100%) rename {contrib/data => data}/queries/abraham/ConstantinouGani.Table4 (100%) rename {contrib/data => data}/queries/charges/2_amino_pyridine.qry (100%) rename {contrib/data => data}/queries/charges/4_amino_pyridine.qry (100%) rename {contrib/data => data}/queries/charges/N_acylpyrazolidinone.qry (100%) rename {contrib/data => data}/queries/charges/N_acylsulfonamide.qry (100%) rename {contrib/data => data}/queries/charges/acid.qry (100%) rename {contrib/data => data}/queries/charges/active (100%) rename {contrib/data => data}/queries/charges/aliphatic_amine.qry (100%) rename {contrib/data => data}/queries/charges/aliphatic_amine_restricted.qry (100%) rename {contrib/data => data}/queries/charges/amidine.qry (98%) rename {contrib/data => data}/queries/charges/amino_terminal.qry (100%) rename {contrib/data => data}/queries/charges/amino_terminal_restricted.qry (100%) rename {contrib/data => data}/queries/charges/carboxylic_acid.qry (100%) rename {contrib/data => data}/queries/charges/fl (100%) rename {contrib/data => data}/queries/charges/guanidine.qry (100%) rename {contrib/data => data}/queries/charges/hydrazine.qry (100%) rename {contrib/data => data}/queries/charges/hydroxamic_acid.qry (100%) rename {contrib/data => data}/queries/charges/imidazole_basic.qry (100%) rename {contrib/data => data}/queries/charges/imidazolidinone.qry (100%) rename {contrib/data => data}/queries/charges/imide.qry (100%) rename {contrib/data => data}/queries/charges/imine.qry (100%) rename {contrib/data => data}/queries/charges/negative (100%) rename {contrib/data => data}/queries/charges/phenolate.qry (100%) rename {contrib/data => data}/queries/charges/phosphonate.qry (100%) rename {contrib/data => data}/queries/charges/positive (100%) rename {contrib/data => data}/queries/charges/pyrazine.qry (100%) rename {contrib/data => data}/queries/charges/pyrazolidinone.qry (100%) rename {contrib/data => data}/queries/charges/pyridazine.qry (100%) create mode 100644 data/queries/charges/pyridine_dione.qry rename {contrib/data => data}/queries/charges/pyrimidine.qry (100%) rename {contrib/data => data}/queries/charges/queries (91%) rename {contrib/data => data}/queries/charges/sulfonic_acid.qry (100%) rename {contrib/data => data}/queries/charges/tetrazole.qry (100%) rename {contrib/data => data}/queries/charges/thiazolidinedione.qry (100%) rename {contrib/data => data}/queries/complex_chirality/alanine.smi (100%) rename {contrib/data => data}/queries/functional_groups/EWG.txt (100%) rename {contrib/data => data}/queries/functional_groups/NAS_electrophile.qry (100%) rename {contrib/data => data}/queries/functional_groups/NNH2.qry (100%) rename {contrib/data => data}/queries/functional_groups/a_bromo_ketone.qry (100%) rename {contrib/data => data}/queries/functional_groups/a_h_ketones.qry (100%) rename {contrib/data => data}/queries/functional_groups/a_h_ketones_nonsymmetric.qry (100%) rename {contrib/data => data}/queries/functional_groups/a_h_ketones_symmetric.qry (100%) rename {contrib/data => data}/queries/functional_groups/acetal.qry (100%) rename {contrib/data => data}/queries/functional_groups/acid_chlorides.qry (100%) rename {contrib/data => data}/queries/functional_groups/acrolein.qry (100%) rename {contrib/data => data}/queries/functional_groups/acrylate.qry (100%) rename {contrib/data => data}/queries/functional_groups/acyl_chlorides.qry (100%) rename {contrib/data => data}/queries/functional_groups/alcohols.qry (100%) rename {contrib/data => data}/queries/functional_groups/alcohols_alkyl.qry (100%) rename {contrib/data => data}/queries/functional_groups/aldehyde_aliphatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/aldehyde_aromatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/aldehydes.qry (100%) rename {contrib/data => data}/queries/functional_groups/aliphatic_aldehyde.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkene.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkene_activated.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkene_non_activated.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkyl_sulfur_pyrimidine.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkynes.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkynes_internal.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkynes_internal_activated.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkynes_internal_non_activated.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkynes_terminal.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkynes_terminal_activated.qry (100%) rename {contrib/data => data}/queries/functional_groups/alkynes_terminal_non_activated.qry (100%) rename {contrib/data => data}/queries/functional_groups/alpha_aminoacid.qry (100%) rename {contrib/data => data}/queries/functional_groups/amides.qry (100%) rename {contrib/data => data}/queries/functional_groups/amides_aliphatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/amides_aromatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/amides_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amides_secondary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amidines.qry (100%) rename {contrib/data => data}/queries/functional_groups/amidines_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amidines_secondary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aliphatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aliphatic_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aliphatic_primary_branched.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aliphatic_primary_unbranched.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aliphatic_secondary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aliphatic_secondary_acyclic.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aliphatic_secondary_cyclic.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aromatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aromatic_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aromatic_secondary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aromatic_secondary_1.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_aromatic_secondary_2.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_heteroaromatic_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/amines_primary_unhindered.qry (100%) rename {contrib/data => data}/queries/functional_groups/aromatic_aldehyde.qry (100%) rename {contrib/data => data}/queries/functional_groups/arylbromide.qry (100%) rename {contrib/data => data}/queries/functional_groups/arylchloride.qry (100%) rename {contrib/data => data}/queries/functional_groups/aryliodide.qry (100%) rename {contrib/data => data}/queries/functional_groups/azide.qry (100%) rename {contrib/data => data}/queries/functional_groups/azide_carbon.qry (100%) rename {contrib/data => data}/queries/functional_groups/azide_sulfonyl.qry (100%) rename {contrib/data => data}/queries/functional_groups/badboron.qry (100%) rename {contrib/data => data}/queries/functional_groups/beta_aminoacid.qry (100%) rename {contrib/data => data}/queries/functional_groups/boc.qry (100%) rename {contrib/data => data}/queries/functional_groups/boronic_acids.qry (100%) rename {contrib/data => data}/queries/functional_groups/boronics.qry (100%) rename {contrib/data => data}/queries/functional_groups/boronics_aliphatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/boronics_aromatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/carbamate.qry (100%) rename {contrib/data => data}/queries/functional_groups/carboxylic_acids.qry (100%) rename {contrib/data => data}/queries/functional_groups/chloroformates.qry (100%) rename {contrib/data => data}/queries/functional_groups/cyano.qry (100%) rename {contrib/data => data}/queries/functional_groups/cyano_alkyl.qry (100%) rename {contrib/data => data}/queries/functional_groups/cyano_amine.qry (100%) rename {contrib/data => data}/queries/functional_groups/cyano_aryl.qry (100%) rename {contrib/data => data}/queries/functional_groups/dicarbonyl_imide.qry (100%) rename {contrib/data => data}/queries/functional_groups/diols.qry (100%) rename {contrib/data => data}/queries/functional_groups/disulfide.qry (100%) rename {contrib/data => data}/queries/functional_groups/esters.qry (100%) rename {contrib/data => data}/queries/functional_groups/esters_carboxylic.qry (100%) rename {contrib/data => data}/queries/functional_groups/esters_methyl.qry (100%) rename {contrib/data => data}/queries/functional_groups/esters_methyl_aliphatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/esters_methyl_aromatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/esters_methyl_ethyl.qry (100%) rename {contrib/data => data}/queries/functional_groups/ethers.qry (100%) rename {contrib/data => data}/queries/functional_groups/fluorinecarbon.qry (100%) rename {contrib/data => data}/queries/functional_groups/fmoc.qry (100%) rename {contrib/data => data}/queries/functional_groups/fragments.qry (100%) rename {contrib/data => data}/queries/functional_groups/guanidines.qry (100%) rename {contrib/data => data}/queries/functional_groups/guanidines_secondary_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/guanidines_secondary_secondary.qry (100%) rename {contrib/data => data}/queries/functional_groups/guanidines_sectert_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/guanidines_tertiary_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/guanidines_tertiary_secondary.qry (100%) rename {contrib/data => data}/queries/functional_groups/halides_alkyl.qry (100%) rename {contrib/data => data}/queries/functional_groups/halides_aryl.qry (100%) rename {contrib/data => data}/queries/functional_groups/halides_benzyl.qry (100%) rename {contrib/data => data}/queries/functional_groups/halides_hetero.qry (100%) rename {contrib/data => data}/queries/functional_groups/haloalkene.qry (100%) rename {contrib/data => data}/queries/functional_groups/hydrazides.qry (100%) rename {contrib/data => data}/queries/functional_groups/hydrazines.qry (100%) rename {contrib/data => data}/queries/functional_groups/hydrazines_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/imines.qry (100%) rename {contrib/data => data}/queries/functional_groups/imines_aliphatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/imines_halide_aromatic.qry (100%) rename {contrib/data => data}/queries/functional_groups/indole.qry (100%) rename {contrib/data => data}/queries/functional_groups/isocyanates.qry (100%) rename {contrib/data => data}/queries/functional_groups/isocyanides.qry (100%) rename {contrib/data => data}/queries/functional_groups/isothiocyanates.qry (100%) rename {contrib/data => data}/queries/functional_groups/isotope.qry (100%) rename {contrib/data => data}/queries/functional_groups/ketal.qry (100%) rename {contrib/data => data}/queries/functional_groups/ketones.qry (100%) rename {contrib/data => data}/queries/functional_groups/ketones_a_bromo.qry (100%) rename {contrib/data => data}/queries/functional_groups/nhydroxyamides.qry (100%) rename {contrib/data => data}/queries/functional_groups/nitriles.qry (100%) rename {contrib/data => data}/queries/functional_groups/nitro.qry (100%) rename {contrib/data => data}/queries/functional_groups/nitro_del.qry (100%) rename {contrib/data => data}/queries/functional_groups/nitro_fluoro.qry (100%) rename {contrib/data => data}/queries/functional_groups/nonorganic.qry (100%) rename {contrib/data => data}/queries/functional_groups/nvoc.qry (100%) rename {contrib/data => data}/queries/functional_groups/o_amino_phenols.qry (100%) rename {contrib/data => data}/queries/functional_groups/o_amino_thiophenols.qry (100%) rename {contrib/data => data}/queries/functional_groups/o_iodo_aniline.qry (100%) rename {contrib/data => data}/queries/functional_groups/o_iodo_sec_aniline.qry (100%) rename {contrib/data => data}/queries/functional_groups/o_nitro_sec_aniline.qry (100%) rename {contrib/data => data}/queries/functional_groups/oxime.qry (100%) rename {contrib/data => data}/queries/functional_groups/phenols.qry (100%) rename {contrib/data => data}/queries/functional_groups/phosphorus.qry (100%) rename {contrib/data => data}/queries/functional_groups/prim_aniline_fmoc.qry (100%) rename {contrib/data => data}/queries/functional_groups/propiolate.qry (100%) rename {contrib/data => data}/queries/functional_groups/propynal.qry (100%) rename {contrib/data => data}/queries/functional_groups/pyrazole.qry (100%) rename {contrib/data => data}/queries/functional_groups/queries_alc (100%) rename {contrib/data => data}/queries/functional_groups/queries_complete (100%) rename {contrib/data => data}/queries/functional_groups/queries_del (100%) rename {contrib/data => data}/queries/functional_groups/queries_delnew (100%) rename {contrib/data => data}/queries/functional_groups/sec_aniline_boc.qry (100%) rename {contrib/data => data}/queries/functional_groups/sec_aniline_fmoc.qry (100%) rename {contrib/data => data}/queries/functional_groups/sec_boc.qry (100%) rename {contrib/data => data}/queries/functional_groups/sec_fmoc.qry (100%) rename {contrib/data => data}/queries/functional_groups/sulfonamides.qry (100%) rename {contrib/data => data}/queries/functional_groups/sulfonamides_acyl.qry (100%) rename {contrib/data => data}/queries/functional_groups/sulfonamides_aryl.qry (100%) rename {contrib/data => data}/queries/functional_groups/sulfonamides_primary.qry (100%) rename {contrib/data => data}/queries/functional_groups/sulfonic_acids.qry (100%) rename {contrib/data => data}/queries/functional_groups/sulfonyl_chlorides.qry (100%) rename {contrib/data => data}/queries/functional_groups/suzuki_boronics.qry (100%) rename {contrib/data => data}/queries/functional_groups/tert_boc.qry (100%) rename {contrib/data => data}/queries/functional_groups/tert_fmoc.qry (100%) rename {contrib/data => data}/queries/functional_groups/tetrazole.qry (100%) rename {contrib/data => data}/queries/functional_groups/thiols.qry (100%) rename {contrib/data => data}/queries/functional_groups/thiophenols.qry (100%) rename {contrib/data => data}/queries/functional_groups/thp.qry (100%) rename {contrib/data => data}/queries/functional_groups/triazine_chloro.qry (100%) rename {contrib/data => data}/queries/functional_groups/triazine_dichloro.qry (100%) rename {contrib/data => data}/queries/functional_groups/triazine_monochloro.qry (100%) rename {contrib/data => data}/queries/functional_groups/triazine_trichloro.qry (100%) rename {contrib/data => data}/queries/functional_groups/trifluoroborates.qry (100%) rename {contrib/data => data}/queries/functional_groups/trityl.qry (100%) rename {contrib/data => data}/queries/functional_groups/ynones.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1A4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B1AE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B1AEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B1AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B1DE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B1DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B1DEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B1DED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2AE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2AE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2AE2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2AEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2DE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2DE2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2DE2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2DEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B2DED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3AE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3AE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3AE3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3AEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3DE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3DE3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3DEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B3DED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B4AEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B4AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B4DEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B4DED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1B6AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1BAEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1BDEA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1BDED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D5A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A1D5D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2A2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2A2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2A3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2A3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2B1AE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2B1DE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2B1DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2B2AE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2B2AE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2B2DE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2B2DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2D2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2D2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2D3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2D3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A2D4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A3A3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A3A3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A5A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A5D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A6A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/A6D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA5A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AA5D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AAA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AAD.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD5A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/AD5D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/ADA.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/ADD.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1A1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1A2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1A2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1A3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1A3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1A4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1A4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B1AE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B1AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B1DE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B1DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B1DED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2AE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2AE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2AE2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2DE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2DE2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2DE2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B2DED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B3AE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B3AE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B3AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B3DE1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B3DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B3DED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B4AED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1B4DED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1BDED.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1D1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1D2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1D2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1D3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1D3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1D4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D1D4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2A2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2A3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2A3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2B1DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2B2AE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2B2DE1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2D2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2D3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2D3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D2D4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D5D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/D6D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA5A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DA5D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DAD.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD1A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD1D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD2A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD2D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD3A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD3D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD4A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD4D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD5A.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DD5D.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/DDD.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta1.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta10.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta2.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta3.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta4.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta5.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta6.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta7.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta8.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/counta9.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd1.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd10.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd2.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd3.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd4.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd5.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd6.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd7.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd8.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/countd9.qry (100%) rename {contrib/data => data}/queries/hbondpatterns/nass (100%) rename {contrib/data => data}/queries/hbondpatterns/nass.26may00 (100%) rename {contrib/data => data}/queries/hbondpatterns/nass.s1 (100%) rename {contrib/data => data}/queries/hbondpatterns/nass.s2 (100%) rename {contrib/data => data}/queries/hbondpatterns/queries (100%) rename {contrib/data => data}/queries/hbonds/acceptor (100%) rename {contrib/data => data}/queries/hbonds/aminunch.qry (100%) rename {contrib/data => data}/queries/hbonds/carbonyl.qry (100%) rename {contrib/data => data}/queries/hbonds/cyano.qry (100%) rename {contrib/data => data}/queries/hbonds/donor.qry (100%) rename {contrib/data => data}/queries/hbonds/ether.qry (100%) rename {contrib/data => data}/queries/hbonds/hydroxam.qry (100%) rename {contrib/data => data}/queries/hbonds/hydroxyl.qry (100%) rename {contrib/data => data}/queries/hbonds/imine.qry (100%) rename {contrib/data => data}/queries/hbonds/qminus.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1A4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B1AE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B1AEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B1AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B1DE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B1DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B1DEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B1DED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2AE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2AE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2AE2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2AEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2DE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2DE2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2DE2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2DEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B2DED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3AE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3AE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3AE3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3AEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3DE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3DE3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3DEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B3DED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B4AEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B4AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B4DEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B4DED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1B6AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1BAEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1BDEA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1BDED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D5A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A1D5D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2A2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2A2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2A3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2A3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2B1AE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2B1DE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2B1DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2B2AE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2B2AE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2B2DE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2B2DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2D2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2D2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2D3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2D3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A2D4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A3A3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A3A3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A5A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A5D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A6A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A6D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/A7A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA5A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AA5D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AAA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AAD.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD5A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/AD5D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/ADA.qry (100%) rename {contrib/data => data}/queries/heteroatoms/ADD.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1A1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1A2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1A2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1A3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1A3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1A4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1A4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B1AE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B1AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B1DE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B1DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B1DED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2AE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2AE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2AE2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2DE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2DE2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2DE2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B2DED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B3AE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B3AE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B3AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B3DE1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B3DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B3DED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B4AED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1B4DED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1BDED.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1D1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1D2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1D2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1D3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1D3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1D4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D1D4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2A2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2A3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2A3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2B1DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2B2AE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2B2DE1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2D2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2D3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2D3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D2D4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D5D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/D6D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA5A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DA5D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DAD.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD1A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD1D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD2A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD2D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD3A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD3D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD4A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD4D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD5A.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DD5D.qry (100%) rename {contrib/data => data}/queries/heteroatoms/DDD.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta1.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta10.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta2.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta3.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta4.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta5.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta6.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta7.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta8.qry (100%) rename {contrib/data => data}/queries/heteroatoms/counta9.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd1.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd10.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd2.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd3.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd4.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd5.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd6.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd7.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd8.qry (100%) rename {contrib/data => data}/queries/heteroatoms/countd9.qry (100%) rename {contrib/data => data}/queries/heteroatoms/unique_queries_tnass (100%) rename {contrib/data => data}/queries/isosteres/CdoubleS2CdoubleO.correct (100%) rename {contrib/data => data}/queries/isosteres/CdoubleS2CdoubleO.rxn (100%) rename {contrib/data => data}/queries/isosteres/CdoubleS2CdoubleO.smi (100%) rename {contrib/data => data}/queries/isosteres/F2H.correct (100%) rename {contrib/data => data}/queries/isosteres/F2H.rxn (100%) rename {contrib/data => data}/queries/isosteres/F2H.smi (100%) rename {contrib/data => data}/queries/isosteres/cyclopropyl2ethyl.correct (100%) rename {contrib/data => data}/queries/isosteres/cyclopropyl2ethyl.rxn (100%) rename {contrib/data => data}/queries/isosteres/cyclopropyl2ethyl.smi (100%) rename {contrib/data => data}/queries/isosteres/dotest (100%) rename {contrib/data => data}/queries/isosteres/furyl2phenyl.rxn (100%) rename {contrib/data => data}/queries/isosteres/halogen2methyl.correct (100%) rename {contrib/data => data}/queries/isosteres/halogen2methyl.rxn (100%) rename {contrib/data => data}/queries/isosteres/halogen2methyl.smi (100%) rename {contrib/data => data}/queries/isosteres/queries (100%) rename {contrib/data => data}/queries/isosteres/so22co.correct (100%) rename {contrib/data => data}/queries/isosteres/so22co.rxn (100%) rename {contrib/data => data}/queries/isosteres/so22co.smi (100%) rename {contrib/data => data}/queries/isosteres/so2co.correct (100%) rename {contrib/data => data}/queries/isosteres/so2co.rxn (100%) rename {contrib/data => data}/queries/isosteres/so2co.smi (100%) rename {contrib/data => data}/queries/isosteres/test_so2.smi (100%) rename {contrib/data => data}/queries/isosteres/thioether2methylene.correct (100%) rename {contrib/data => data}/queries/isosteres/thioether2methylene.rxn (100%) rename {contrib/data => data}/queries/isosteres/thioether2methylene.smi (100%) rename {contrib/data => data}/queries/medchemrules/3_valent_halogen.qry (100%) rename {contrib/data => data}/queries/medchemrules/3_valent_iodine.qry (100%) rename {contrib/data => data}/queries/medchemrules/4_valent_sulphur_2_connections.qry (100%) rename {contrib/data => data}/queries/medchemrules/6_membered_aromatic_sulfur.qry (100%) rename {contrib/data => data}/queries/medchemrules/8_aminoquinoline.qry (100%) rename {contrib/data => data}/queries/medchemrules/8_hydroxyquinoline.qry (100%) rename {contrib/data => data}/queries/medchemrules/9_aminoacridine.qry (100%) rename {contrib/data => data}/queries/medchemrules/O_alkyl_hydroxylamine.qry (100%) rename {contrib/data => data}/queries/medchemrules/acetal_1_in_ring.qry (100%) rename {contrib/data => data}/queries/medchemrules/acetal_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/acetal_both_in_ring.qry (100%) rename {contrib/data => data}/queries/medchemrules/acetate_ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/acetylene.qry (100%) rename {contrib/data => data}/queries/medchemrules/acetylene_heteroatom.qry (100%) rename {contrib/data => data}/queries/medchemrules/acid_halide.qry (100%) rename {contrib/data => data}/queries/medchemrules/activated_ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/activated_phthalimide.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_amide_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_amide_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_arom_n.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_aromatic_nn.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_enol.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_hydrazone_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_hydroxamate.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_hydroxamate_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_hydroxamate_3.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_isoamide_aromatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_oxime.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_sulfonamide.qry (100%) rename {contrib/data => data}/queries/medchemrules/acyl_thiohydroxamate.qry (100%) rename {contrib/data => data}/queries/medchemrules/acylated_enol.qry (100%) rename {contrib/data => data}/queries/medchemrules/acylated_halo_phenol.qry (100%) rename {contrib/data => data}/queries/medchemrules/acylurea.qry (100%) rename {contrib/data => data}/queries/medchemrules/adamantane.qry (100%) rename {contrib/data => data}/queries/medchemrules/adamantane_sub.qry (100%) rename {contrib/data => data}/queries/medchemrules/aldehyde.qry (100%) rename {contrib/data => data}/queries/medchemrules/alkyl_fluoride_activated.qry (100%) rename {contrib/data => data}/queries/medchemrules/alkyl_iodide.qry (100%) rename {contrib/data => data}/queries/medchemrules/alkyl_sulfite.qry (100%) rename {contrib/data => data}/queries/medchemrules/alkylthio_N_aromatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/alkyne_michael.qry (100%) rename {contrib/data => data}/queries/medchemrules/alkynylsulfone.qry (100%) rename {contrib/data => data}/queries/medchemrules/allene.qry (100%) rename {contrib/data => data}/queries/medchemrules/aminal_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/amino_ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/amino_naphthalene.qry (100%) rename {contrib/data => data}/queries/medchemrules/aminomethyl_ketone_peptide.qry (100%) rename {contrib/data => data}/queries/medchemrules/aminophenol.qry (100%) rename {contrib/data => data}/queries/medchemrules/anhydride.qry (100%) rename {contrib/data => data}/queries/medchemrules/aniline_acyl_ewd.qry (100%) rename {contrib/data => data}/queries/medchemrules/aniline_acyl_newd.qry (100%) rename {contrib/data => data}/queries/medchemrules/aniline_h_ewd.qry (100%) rename {contrib/data => data}/queries/medchemrules/aniline_h_newd.qry (100%) rename {contrib/data => data}/queries/medchemrules/aniline_no_h_ewd.qry (100%) rename {contrib/data => data}/queries/medchemrules/aniline_no_h_newd.qry (100%) rename {contrib/data => data}/queries/medchemrules/anthra_ketone.qry (100%) rename {contrib/data => data}/queries/medchemrules/anthracene_het.qry (100%) rename {contrib/data => data}/queries/medchemrules/anthracene_phenanthrene.qry (100%) rename {contrib/data => data}/queries/medchemrules/aromatic_iodide.qry (100%) rename {contrib/data => data}/queries/medchemrules/azapteridine.qry (100%) rename {contrib/data => data}/queries/medchemrules/aziridine.qry (100%) rename {contrib/data => data}/queries/medchemrules/benzocyclopentenone.qry (100%) rename {contrib/data => data}/queries/medchemrules/beta_lactone.qry (100%) rename {contrib/data => data}/queries/medchemrules/biguanide.qry (100%) rename {contrib/data => data}/queries/medchemrules/biotin.qry (100%) rename {contrib/data => data}/queries/medchemrules/bis_aryl_maleimide.qry (100%) rename {contrib/data => data}/queries/medchemrules/boc.qry (100%) rename {contrib/data => data}/queries/medchemrules/bromine.qry (100%) rename {contrib/data => data}/queries/medchemrules/ccl3.qry (100%) rename {contrib/data => data}/queries/medchemrules/cf3.qry (100%) rename {contrib/data => data}/queries/medchemrules/charged_halide.qry (100%) rename {contrib/data => data}/queries/medchemrules/chlorine.qry (100%) rename {contrib/data => data}/queries/medchemrules/conjugated_triene_acyclic_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/coumarin.qry (100%) rename {contrib/data => data}/queries/medchemrules/cplus.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_2_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_2_2_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_2_2_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_2_3.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_2_3_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_2_3_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_3_3.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_3_3_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/crown_3_3_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyanine_dye.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyano.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyano_amine.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyano_methyl_amine.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyano_methyl_sulfide.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyanohydrin.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyclobutadiene.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyclohexane.qry (100%) rename {contrib/data => data}/queries/medchemrules/cyclohexane_diene.qry (100%) rename {contrib/data => data}/queries/medchemrules/demerits (100%) rename {contrib/data => data}/queries/medchemrules/di_thio_acetal_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/diacylhydrazide.qry (100%) rename {contrib/data => data}/queries/medchemrules/dialkylsulfate_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/diamidine.qry (100%) rename {contrib/data => data}/queries/medchemrules/diaminal_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/diazo_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/dicyanomethylene.qry (100%) rename {contrib/data => data}/queries/medchemrules/dienone.qry (100%) rename {contrib/data => data}/queries/medchemrules/dihalo_vinyl_1_2_dicarbonyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/dihydro_124_triazine.qry (100%) rename {contrib/data => data}/queries/medchemrules/dihydro_pyrrolidone.qry (100%) rename {contrib/data => data}/queries/medchemrules/diphosphate.qry (100%) rename {contrib/data => data}/queries/medchemrules/dithio_olefin.qry (100%) rename {contrib/data => data}/queries/medchemrules/divinyl_carbonyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/dna_intercalator_1.qry (100%) rename {contrib/data => data}/queries/medchemrules/enamine.qry (100%) rename {contrib/data => data}/queries/medchemrules/enamine_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/enol_or_vinyl_ether.qry (100%) rename {contrib/data => data}/queries/medchemrules/ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/ester_thione.qry (100%) rename {contrib/data => data}/queries/medchemrules/f2_c_o2.qry (100%) rename {contrib/data => data}/queries/medchemrules/five_connected_n_or_p.qry (100%) rename {contrib/data => data}/queries/medchemrules/five_valent_nitrogen.qry (100%) rename {contrib/data => data}/queries/medchemrules/fluorine.qry (100%) rename {contrib/data => data}/queries/medchemrules/fluoro_methyl_ketone.qry (100%) rename {contrib/data => data}/queries/medchemrules/fmoc.qry (100%) rename {contrib/data => data}/queries/medchemrules/formylated.qry (100%) rename {contrib/data => data}/queries/medchemrules/four_valent_s_h.qry (100%) rename {contrib/data => data}/queries/medchemrules/four_valent_sulphur.qry (100%) rename {contrib/data => data}/queries/medchemrules/furan.qry (100%) rename {contrib/data => data}/queries/medchemrules/fused_tetrahydroquinoline.qry (100%) rename {contrib/data => data}/queries/medchemrules/half_sulfur_peroxide.qry (100%) rename {contrib/data => data}/queries/medchemrules/halo_imine.qry (100%) rename {contrib/data => data}/queries/medchemrules/halo_next_to_aryl_n_w_ewg.qry (100%) rename {contrib/data => data}/queries/medchemrules/halo_phthalazine.qry (100%) rename {contrib/data => data}/queries/medchemrules/halogen_nps.qry (100%) rename {contrib/data => data}/queries/medchemrules/halogen_to_oxygen.qry (100%) rename {contrib/data => data}/queries/medchemrules/halogenated_aromatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/halomethyl_ketone.qry (100%) rename {contrib/data => data}/queries/medchemrules/hemiacetal_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/het_3mem_ring.qry (100%) rename {contrib/data => data}/queries/medchemrules/het_3mem_ring_fused.qry (100%) rename {contrib/data => data}/queries/medchemrules/hydrazide.qry (100%) rename {contrib/data => data}/queries/medchemrules/hydrazide_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/hydrazide_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/hydrazone.qry (100%) rename {contrib/data => data}/queries/medchemrules/iminal.qry (100%) rename {contrib/data => data}/queries/medchemrules/imine_aromatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/imino_oxime.qry (100%) rename {contrib/data => data}/queries/medchemrules/isoamide_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/isocyano.qry (100%) rename {contrib/data => data}/queries/medchemrules/isodithiocarbamate.qry (100%) rename {contrib/data => data}/queries/medchemrules/isolated_aromatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/isothiazole_carbonyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/isothioamide_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/isothioamide_cyclicS.qry (100%) rename {contrib/data => data}/queries/medchemrules/isothiourea.qry (100%) rename {contrib/data => data}/queries/medchemrules/isothiourea_sulfonamide.qry (100%) rename {contrib/data => data}/queries/medchemrules/keto_carbonyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/ketoamide_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/lucifer_yellow.qry (100%) rename {contrib/data => data}/queries/medchemrules/mcr_queries (100%) rename {contrib/data => data}/queries/medchemrules/melamine.qry (100%) rename {contrib/data => data}/queries/medchemrules/menthol.qry (100%) rename {contrib/data => data}/queries/medchemrules/metanitro.qry (100%) rename {contrib/data => data}/queries/medchemrules/methylene_bis_sulfone.qry (100%) rename {contrib/data => data}/queries/medchemrules/methylene_bis_sulfone_diaryl.qry (100%) rename {contrib/data => data}/queries/medchemrules/michael_demerited.qry (100%) rename {contrib/data => data}/queries/medchemrules/michael_rejected.qry (100%) rename {contrib/data => data}/queries/medchemrules/michael_thione.qry (100%) rename {contrib/data => data}/queries/medchemrules/multiple_nitro.qry (100%) rename {contrib/data => data}/queries/medchemrules/n_double_s_double_n_ring.qry (100%) rename {contrib/data => data}/queries/medchemrules/n_hydroxy.qry (100%) rename {contrib/data => data}/queries/medchemrules/n_o_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/n_oxide.qry (100%) rename {contrib/data => data}/queries/medchemrules/n_s_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/naphthalene_sulfonate.qry (100%) rename {contrib/data => data}/queries/medchemrules/naphthyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/ncn.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitro.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitro_alpha_hetero.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitro_alpha_to_halogen.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitro_phenol_or_aniline.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitromethyl_sulfone.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitrone.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitrosamine.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitroso.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitrous_ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitroxide.qry (100%) rename {contrib/data => data}/queries/medchemrules/nitroxyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/no_rings.qry (100%) rename {contrib/data => data}/queries/medchemrules/non_ring_ketal.qry (100%) rename {contrib/data => data}/queries/medchemrules/nso_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/o_or_s_plus.qry (100%) rename {contrib/data => data}/queries/medchemrules/orthonitropyridine.qry (100%) rename {contrib/data => data}/queries/medchemrules/oxime.qry (100%) rename {contrib/data => data}/queries/medchemrules/oxiridine.qry (100%) rename {contrib/data => data}/queries/medchemrules/penicillin_cephalosporin.qry (100%) rename {contrib/data => data}/queries/medchemrules/perchlorate.qry (100%) rename {contrib/data => data}/queries/medchemrules/perimidine.qry (100%) rename {contrib/data => data}/queries/medchemrules/peroxide.qry (100%) rename {contrib/data => data}/queries/medchemrules/phenanthrene_het.qry (100%) rename {contrib/data => data}/queries/medchemrules/phenol_phosphate_ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/phenolate.qry (100%) rename {contrib/data => data}/queries/medchemrules/phenolic_ester_or_carbamate.qry (100%) rename {contrib/data => data}/queries/medchemrules/phenylenediamine.qry (100%) rename {contrib/data => data}/queries/medchemrules/phosphate_ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/phosphate_ester_ian_echo.qry (100%) rename {contrib/data => data}/queries/medchemrules/phosphoric_acid.qry (100%) rename {contrib/data => data}/queries/medchemrules/phthalimide.qry (100%) rename {contrib/data => data}/queries/medchemrules/po4.qry (100%) rename {contrib/data => data}/queries/medchemrules/polyphenol.qry (100%) rename {contrib/data => data}/queries/medchemrules/pyridazine_dione.qry (100%) rename {contrib/data => data}/queries/medchemrules/pyrrole.qry (100%) rename {contrib/data => data}/queries/medchemrules/pyrrole_vinylidene.qry (100%) rename {contrib/data => data}/queries/medchemrules/q.tar (100%) rename {contrib/data => data}/queries/medchemrules/qry2json.rb (100%) rename {contrib/data => data}/queries/medchemrules/quat_n_heteroatom.qry (100%) rename {contrib/data => data}/queries/medchemrules/quat_schiff_base.qry (100%) rename {contrib/data => data}/queries/medchemrules/quaternary_amine.qry (100%) rename {contrib/data => data}/queries/medchemrules/quaternary_aryl.qry (100%) rename {contrib/data => data}/queries/medchemrules/queries (100%) rename {contrib/data => data}/queries/medchemrules/quinone_methide.qry (100%) rename {contrib/data => data}/queries/medchemrules/quinone_para.qry (100%) rename {contrib/data => data}/queries/medchemrules/reject1 (100%) rename {contrib/data => data}/queries/medchemrules/reject2 (100%) rename {contrib/data => data}/queries/medchemrules/reverse_michael.qry (100%) rename {contrib/data => data}/queries/medchemrules/reverse_michael_demerit.qry (100%) rename {contrib/data => data}/queries/medchemrules/reverse_michael_quat.qry (100%) rename {contrib/data => data}/queries/medchemrules/rhodanine.qry (100%) rename {contrib/data => data}/queries/medchemrules/ring_system_too_large.qry (100%) rename {contrib/data => data}/queries/medchemrules/ring_system_too_large_with_aromatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/s_4_single_bonds.qry (100%) rename {contrib/data => data}/queries/medchemrules/scf3.qry (100%) rename {contrib/data => data}/queries/medchemrules/sch2s.qry (100%) rename {contrib/data => data}/queries/medchemrules/schiff_base.qry (100%) rename {contrib/data => data}/queries/medchemrules/scscs.qry (100%) rename {contrib/data => data}/queries/medchemrules/so.qry (100%) rename {contrib/data => data}/queries/medchemrules/ss.qry (100%) rename {contrib/data => data}/queries/medchemrules/steve1.qry (100%) rename {contrib/data => data}/queries/medchemrules/strongly_fused_ring_system.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfimine.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonamide_methylene_sulfone.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonic_acid.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonium.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonyl_ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonyl_halide.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonyl_hydrazone.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonyl_imine.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonyl_n_aromatic_edg.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonyl_n_aromatic_nedg.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonyl_urea.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfonylmichael.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulfoxide_imine.qry (100%) rename {contrib/data => data}/queries/medchemrules/sulphur.qry (100%) rename {contrib/data => data}/queries/medchemrules/tbutyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/thio_aminal_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thio_ester_thione_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thio_ester_thione_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thio_oxime.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioacetal_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioaminal_C_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioaminal_n_sub_cyclic_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioaminal_n_unsub_cyclic_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiocarbonyl_aromatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiocarbonyl_diester.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiocyanate.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioester.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioester_acyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioester_acyclic_aliphatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioester_acyclic_aromatic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thioester_cyclic.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiohydrazide.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiol.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiomethyl_ketone.qry (100%) rename {contrib/data => data}/queries/medchemrules/thione.qry (100%) rename {contrib/data => data}/queries/medchemrules/thione_oxide.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiophene_furan_n_acyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiophene_furan_nh.qry (100%) rename {contrib/data => data}/queries/medchemrules/thiourea.qry (100%) rename {contrib/data => data}/queries/medchemrules/too_many_aromatic_rings_in_ring_system.qry (100%) rename {contrib/data => data}/queries/medchemrules/too_many_sulfonate.qry (100%) rename {contrib/data => data}/queries/medchemrules/triflate.qry (100%) rename {contrib/data => data}/queries/medchemrules/trifluoroacetate_ester.qry (100%) rename {contrib/data => data}/queries/medchemrules/trifluoroborate.qry (100%) rename {contrib/data => data}/queries/medchemrules/triphenylmethyl.qry (100%) rename {contrib/data => data}/queries/medchemrules/trivalent_phosphorus.qry (100%) rename {contrib/data => data}/queries/medchemrules/tropolone.qry (100%) rename {contrib/data => data}/queries/medchemrules/unsat_n_plus.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_cyano_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_cyano_het.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_disulfide.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_disulfone.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_disulfur.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_ether.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_ether_thioate_isoamide.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_halide_2_halogens.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_halide_3_halogens.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_nitro.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_sulfone_2.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_sulfone_3.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_sulfoxide.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_sulphide.qry (100%) rename {contrib/data => data}/queries/medchemrules/vinyl_thioether.qry (100%) rename {contrib/data => data}/queries/molAttractiveness/PolyHalogenatedRings/polybrominated_ring.qry (100%) rename {contrib/data => data}/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring.qry (100%) rename {contrib/data => data}/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring_system.qry (100%) rename {contrib/data => data}/queries/molAttractiveness/PolyHalogenatedRings/polyfluorinated_ring.qry (100%) rename {contrib/data => data}/queries/molAttractiveness/PolyHalogenatedRings/polyhalogenated_queries.list (100%) rename {contrib/data => data}/queries/molAttractiveness/PolyHalogenatedRings/polyiodinated_ring.qry (100%) rename {contrib/data => data}/queries/molAttractiveness/StronglyFusedRings/strongly_fused.qry (100%) rename {contrib/data => data}/queries/molAttractiveness/StronglyFusedRings/strongly_fused_rings.qry (100%) rename {contrib/data => data}/queries/molAttractiveness/StronglyFusedRings/whatwedid (100%) rename {contrib/data => data}/queries/nouglymolecules/large_ring_system.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/large_ring_system_3.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/large_ring_system_4.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/large_ring_system_5.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/large_ring_system_6.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/large_ring_system_7.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/polyfluorinated.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/spiro.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/spiro_sys.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/strongly_fused.qry (100%) rename {contrib/data => data}/queries/nouglymolecules/strongly_fused.s1 (100%) rename {contrib/data => data}/queries/nouglymolecules/too_many_rings.qry (100%) rename {contrib/data => data}/queries/pharmacophore/hydrophobe2.qry (100%) rename {contrib/data => data}/queries/pharmacophore/pharmacophore (100%) rename {contrib/data => data}/queries/zof/between_rings.qry (100%) rename {contrib/data => data}/queries/zof/coumarin.qry (100%) rename {contrib/data => data}/queries/zof/dimethyl_ring.qry (100%) rename {contrib/data => data}/queries/zof/disubstituted.qry (100%) rename {contrib/data => data}/queries/zof/ester.qry (100%) rename {contrib/data => data}/queries/zof/floppy.qry (100%) rename {contrib/data => data}/queries/zof/multiple_anilines.qry (100%) rename {contrib/data => data}/queries/zof/multiple_halogen_on_one_ring.qry (100%) rename {contrib/data => data}/queries/zof/multiple_large_ring_systems.qry (100%) rename {contrib/data => data}/queries/zof/polyhalogenated_ring.qry (100%) rename {contrib/data => data}/queries/zof/pyrrole.qry (100%) rename {contrib/data => data}/queries/zof/reverse_coumarin.qry (100%) rename {contrib/data => data}/queries/zof/ring_substitution.qry (100%) rename {contrib/data => data}/queries/zof/strained_6arom4.qry (100%) rename {contrib/data => data}/queries/zof/strongly_fused_ring.qry (100%) rename {contrib/data => data}/queries/zof/too_much_ring_spinach.qry (100%) create mode 100644 data/random_molecular_permutations.d/AAREADME.md rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/Fragments.rings_aliphatic.smi (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/Fragments.rings_aromatic.smi (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/aliphatic_ring.smi (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/aromatic_attachment_fragments.smi (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/aromatic_ring.smi (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/double_attachment_fragments.smi (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/fuse_aromatic_ring.smi (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/graph_edit_changes (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/random_molecular_transformations (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/single_attachment_fragments.smi (100%) rename {contrib/data/random_molecular_transformations.d => data/random_molecular_permutations.d}/single_attachment_fragments_any_atom.smi (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_donor_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_donor.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_donor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_negative.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_negative.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_positive.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aliphatic_ring_positive.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_donor.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_donor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_negative.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_negative.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_non_feature.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_non_feature.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_positive.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/aromatic_ring_positive.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_acceptor1.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_acceptor2.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_acceptor_nitro.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_acid.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_donor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_donor1.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_donor2.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_donor_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_donor_acceptor1.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_donor_acceptor2.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_negative.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_negative.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_positive.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/feature_node_positive.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/link_node.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/link_node.txt (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/phenyl.qry (100%) rename {contrib/data => data}/reduced_graph.donor_acceptor/reductions (100%) rename {contrib/data => data}/reduced_graph/aliphatic_donor_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_donor.qry (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_donor.txt (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_donor_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_donor_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_negative.qry (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_negative.txt (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_non_feature.qry (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_non_feature.txt (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_positive.qry (100%) rename {contrib/data => data}/reduced_graph/aliphatic_ring_positive.txt (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_donor.qry (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_donor.txt (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_donor_acceptor.qry (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_donor_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_negative.qry (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_negative.txt (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_non_feature.qry (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_non_feature.txt (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_positive.qry (100%) rename {contrib/data => data}/reduced_graph/aromatic_ring_positive.txt (100%) rename {contrib/data => data}/reduced_graph/feature_node_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph/feature_node_acceptor1.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_acceptor2.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_acceptor_nitro.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_acid.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_donor.txt (100%) rename {contrib/data => data}/reduced_graph/feature_node_donor1.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_donor2.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_donor_acceptor.txt (100%) rename {contrib/data => data}/reduced_graph/feature_node_donor_acceptor1.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_donor_acceptor2.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_negative.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_negative.txt (100%) rename {contrib/data => data}/reduced_graph/feature_node_positive.qry (100%) rename {contrib/data => data}/reduced_graph/feature_node_positive.txt (100%) rename {contrib/data => data}/reduced_graph/link_node.qry (100%) rename {contrib/data => data}/reduced_graph/link_node.txt (100%) rename {contrib/data => data}/reduced_graph/phenyl.qry (100%) rename {contrib/data => data}/reduced_graph/queries (100%) rename {contrib/data => data}/reduced_graph/reductions (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom3notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom3notarom4notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom3notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom3notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom3notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom4notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom4notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom4notarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom4notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom5isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom5isarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom5isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom5notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom5notarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom5notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom5notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom6isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom6isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom6notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom6notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_3notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4isarom5isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4isarom5isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4isarom5notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4isarom6isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4isarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom4notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom4notarom4notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom4notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom4notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5isarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5notarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom5notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom6isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom6isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom6isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom6notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom6notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_4notarom7notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5isarom5isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5isarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5isarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5notarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5notarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom5notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6isarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6notarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom6notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5isarom7notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom5notarom5notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom5notarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom5notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom5notarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom5notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom6isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom6isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom6isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom6notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom6notarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom6notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_5notarom7notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6isarom6isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6isarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6notarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom6notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom7isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6isarom7notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom6notarom6notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom6notarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom6notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom7isarom7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom7isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_6notarom7notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_7isarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_7isarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/.rings_7notarom7notarom.smi (100%) rename {contrib/data => data}/ring_replacement/README.md (100%) rename {contrib/data => data}/ring_replacement/aggregate_rings.rb (100%) rename {contrib/data => data}/ring_replacement/to_hidden.sh (100%) rename {contrib/data => data}/ring_replacement/to_linux.sh (100%) rename {contrib/data => data}/ring_replacement/to_mac.sh (100%) rename {contrib/data => data}/smiles_mutation_library (100%) create mode 100644 data/zof/between_rings.qry create mode 100644 data/zof/coumarin.qry create mode 100644 data/zof/dimethyl_ring.qry create mode 100644 data/zof/disubstituted.qry create mode 100644 data/zof/ester.qry create mode 100644 data/zof/floppy.qry create mode 100644 data/zof/multiple_anilines.qry create mode 100644 data/zof/multiple_halogen_on_one_ring.qry create mode 100644 data/zof/multiple_large_ring_systems.qry create mode 100644 data/zof/polyhalogenated_ring.qry create mode 100644 data/zof/pyrrole.qry create mode 100644 data/zof/reverse_coumarin.qry create mode 100644 data/zof/ring_substitution.qry create mode 100644 data/zof/strained_6arom4.qry create mode 100644 data/zof/strongly_fused_ring.qry create mode 100644 data/zof/too_much_ring_spinach.qry rename src/{Utilities => }/BerkeleyDB/BUILD (89%) rename src/{Utilities/General => BerkeleyDB}/enough_inventory_bdb.cc (100%) rename src/{Utilities => }/BerkeleyDB/iwbdb_cat.cc (100%) rename src/{Utilities => }/BerkeleyDB/iwbdb_compare.cc (98%) rename src/{Utilities => }/BerkeleyDB/iwbdb_delete.cc (100%) rename src/{Utilities => }/BerkeleyDB/iwbdb_exists.cc (100%) rename src/{Utilities => }/BerkeleyDB/iwbdb_fetch.cc (100%) rename src/{Utilities => }/BerkeleyDB/iwbdb_from_tdt.cc (100%) rename src/{Utilities => }/BerkeleyDB/iwbdb_list.cc (100%) rename src/{Utilities => }/BerkeleyDB/iwbdb_load.cc (100%) rename src/{Utilities => }/BerkeleyDB/iwbdb_merge_into_tdt.cc (100%) rename src/{Utilities => }/BerkeleyDB/unpack_data.cc (100%) rename src/{Utilities => }/BerkeleyDB/unpack_data.h (100%) delete mode 100644 src/Dockerfile delete mode 100644 src/Makefile delete mode 100644 src/Molecule_Lib/iwstandard.h create mode 100644 src/Molecule_Tools/unique_molecules_api.cc create mode 100644 src/Molecule_Tools/unique_molecules_api.h create mode 100644 src/Molecule_Tools_Bdb/BUILD rename src/{Molecule_Tools => Molecule_Tools_Bdb}/buildsmidb_bdb.cc (94%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/dicer_fragment_lookup_bdb.cc (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/in_database_bdb.cc (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/in_lilly_database_bdb.cc (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/iwecfp_database.cc (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/iwecfp_database.h (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/iwecfp_database_load.cc (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/iwecfp_database_lookup.cc (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/smi2rings.proto (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/smi2rings_bdb.cc (99%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/storage_conditions.cc (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/storage_conditions.h (100%) rename src/{Molecule_Tools => Molecule_Tools_Bdb}/substituent_identification.cc (100%) delete mode 100644 src/Utilities/Distance_Matrix/Makefile delete mode 100644 src/Utilities/GFP_Tools/Makefile create mode 100644 src/Utilities/GFP_Tools/gfp_collection_fingerprint.cc create mode 100644 src/Utilities/GFP_Tools/gfp_to_collection.cc delete mode 100644 src/Utilities/General/Makefile delete mode 100644 src/Utilities/Makefile create mode 100644 src/Vendor/AAReadme.md create mode 100644 src/pybind/lillymol_unique_molecules_test.py create mode 100755 src/run_python.sh create mode 100755 src/run_python_unit_tests.sh create mode 100644 src/update_python_in_workspace.py delete mode 100644 test/getMMPfromSMI/case_2/test_data_01.log diff --git a/Dockerfile b/Dockerfile index 469ce595..4e2ceb34 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,56 +1,34 @@ -FROM gcc:10.2 +FROM gcc:13.2 -ENV LILLYMOL_HOME=/LillyMol \ - BUILD_DIR=Linux - -# Install Eigen -# (No need to install zlib since zlib1g and zlib1g-dev are alreday in the gcc base image) RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y libeigen3-dev && \ - cd /usr/include && \ - ln -sf eigen3/Eigen Eigen + apt-get upgrade -y RUN apt-get install npm -y && \ - npm install -g @bazel/bazelisk && \ - apt-get install cmake -y - -RUN apt-get install python3-pip -y && \ - pip3 install pandas && \ - apt-get install libblas-dev -y && \ - apt-get install liblapack-dev -y && \ - pip3 install scipy - -COPY . ./LillyMol - -WORKDIR /LillyMol + npm install -g @bazel/bazelisk -RUN mkdir bin && \ - mkdir bin/Linux && \ - cd src && \ - ./build_third_party.sh - -WORKDIR /LillyMol/src +RUN apt-get install libblas-dev -y && \ + apt-get install liblapack-dev -y -RUN cp /tmp/WORKSPACE . +RUN apt-get install python3-minimal -y && \ + apt-get install python3-pandas python3-scipy python3-absl python3-pybind11 python3-protobuf -y -WORKDIR /LillyMol/src/build_deps +RUN rm -f /usr/bin/python && ln -s /usr/bin/python3 /usr/bin/python -RUN sed -i 's/\/workspaces\/LillyMolPrivate\/bin\/Linux\//\/LillyMol\/bin\/Linux\//g' install.bzl +COPY . ./LillyMol -WORKDIR /LillyMol +ENV LILLYMOL_HOME=/LillyMol \ + BUILD_DIR=Linux +# This step probably not necessary since now, third party +# dependencies are all linked static. Maybe that will change. ENV LD_LIBRARY_PATH=/LillyMol/third_party/lib -RUN mkdir /node && \ - mkdir /node/scratch - WORKDIR /LillyMol/src +ENV BUILD_BDB=1 +ENV BUILD_PYTHON=1 + +RUN ./build_third_party.sh RUN ./build_from_src.sh WORKDIR /LillyMol - -RUN rm -f /usr/bin/python && ln -s /usr/bin/python3 /usr/bin/python - -# RUN apt-get install python3-pip -Y \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..bd5d25c6 --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +# Copyright 2018 Eli Lilly and Company +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +######################################################################## + +.PHONY: default +.PHONY: all + +# A default target that will probably work in most cases. +# Note it does not build BerkeleyDB dependent tools or Python bindings. +default: + bash -c 'if [[ -z "$$(type -p bazelisk)" && -z "$$(type -p bazel)" ]] ; then echo "No bazel/bazelisk, see README.md" && exit 1 ; fi' + echo "Default build does not build targets 'berkeleydb' and 'python'" + cd src && ./build_third_party.sh + cd src && ./build_from_src.sh + +all: + bash -c 'if [[ -z "$$(type -p bazelisk)" && -z "$$(type -p bazel)" ]] ; then echo "No bazel/bazelisk, see README.md" && exit 1 ; fi' + cd src && BUILD_BDB=1 BUILD_PYTHON=1 ./build_third_party.sh + cd src && BUILD_BDB=1 BUILD_PYTHON=1 ./build_from_src.sh + +berkeleydb: + bash -c 'if [[ -z "$$(type -p bazelisk)" && -z "$$(type -p bazel)" ]] ; then echo "No bazel/bazelisk, see README.md" && exit 1 ; fi' + cd src && BUILD_BDB=1 ./build_third_party.sh + cd src && BUILD_BDB=1 ./build_from_src.sh + +python: + bash -c 'if [[ -z "$$(type -p bazelisk)" && -z "$$(type -p bazel)" ]] ; then echo "No bazel/bazelisk, see README.md" && exit 1 ; fi' + cd src && BUILD_PYTHON=1 ./build_third_party.sh + cd src && BUILD_PYTHON=1 ./build_from_src.sh + +build_docker: + docker build -f Dockerfile -t lillymol . + +test_lillymol: + docker container exec lilly_mol bash -c "cd test/ && ./run_all_test.sh" + docker container exec lilly_mol bash -c "cd src/ && ./run_python_unit_tests.sh 2>&1" diff --git a/README.md b/README.md index cf79a6cf..7f076d5d 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,32 @@ # Welcome to the Eli Lilly LillyMol implementation. +![Static Badge](https://img.shields.io/badge/tested_docker_gcc_version-10.2%7C12.3%7C13.2-blue) +![Static Badge](https://img.shields.io/badge/supported_platform-Linux-green) + ## Background LillyMol is a C++ library for Cheminformatics. This repo also contains a variety of useful command line tools that have been built with LillyMol. -Lillymol does only a subset of Cheminformatics tasks, but tries to do those tasks +LillyMol does only a subset of Cheminformatics tasks, but tries to do those tasks efficiently and correctly. -Lillymol has some novel approaches to substructure searching, reaction enumeration and +LillyMol has some novel approaches to substructure searching, reaction enumeration and chemical similarity. These have been developed over many years, driven by the needs of Computational and Medicinal Chemists at Lilly and elsewhere. -LillyMol is fast. The public release now includes a number of C++ unit tests. All +LillyMol is fast and scalable, with modest memory requirements. + +This release includes a number of C++ unit tests. All tests can be run with address sanitizer, with no problems reported. The file [Molecule_Tools/introduction.cc](src/Molecule_Tools/introduction.cc) provides an introduction to LillyMol for anyone wishing to develop with C++. +This release includes first steps towards more extensive documentation of LillyMol, +see the [docs](/docs) directory. More work is needed on this front. Most parts +of LillyMol have been feature stable for a long time. + +## Python This release include a python interface to LillyMol via pybind11. This first release includes most Molecule related functionality, substructure searching and reaction enumeration. In the pybind directory there are some *_test.py files that exemplify @@ -40,7 +50,7 @@ LillyMol is primarily developed on RedHat and Ubuntu systems. The primary build system used for LillyMol is [bazel](https://bazel.build/). You might also choose to use [bazelisk](https://github.com/bazelbuild/bazelisk) -which makes keeping bazel up to date easier. +which makes keeping bazel up to date easier. That is strongly encouraged. Within a GitHub CodeSpace, this worked to install bazelisk. ``` @@ -51,107 +61,89 @@ If you use the module system ``` module load bazelisk ``` +If you are NOT building the python bindings, bazel or bazelisk is equivalent. +If building the python bindings, a frozen version of bazel is needed and this +is controlled by bazelisk. -You **WILL** need to edit bazel's configuration file [WORKSPACE](/src/WORKSPACE) in order to -make things work on your file system. More below. - -Support for `cmake` is rudimentary. It sometimes works. Improvements would -be welcome. Some third party dependencies may depend on recent versions of `cmake`. +The software requires a gcc version of at least version 10. This version of LillyMol +uses some fairly recent c++ features, which require a recent compiler. The software +has been tested with gcc13. If you use the module system ``` -module load cmake +module load gcc10 +module load bazelisk +module load git +``` +### Python +If you wish to build the python bindings, you will need a recent version of +python. Development was done with python3.11 and has not been +tested on any other version, although we have no reason to believe +it will not work with other versions. You will need to install +``` +pip install pybind11 absl-py protobuf ``` +Note that with the default build (below) Python bindings are not built. -## Dependencies. +# TLDR +If you have bazelisk and gcc installed, there is a reasonable possibility that +issuing `make` in the top level directory will work (but see note below +about NFS filesystems). +``` +cd /path/to/Lillymol +make +``` +Executables will be in bin/$(uname) and libraries in lib. More details +below. There is no concept of installation prefix, everything remains +in the repo. + +*Note* by default neither Python bindings nor Berkeley DB dependencies +are built. If you wish to build either of those +``` +make python +make berkeleydb +``` +If you look at (Makefile)[Makefile] you will see that all it is doing +is sequentially invoking the two scripts discussed below, possibly with +various shell variables set, which enable the optional builds. + +### C++ Dependencies. There are several dependencies which could be installed on the system, which would considerably simplify the build configuration, but during development we have frequently found ourselves on machines that could -not be updated to the versions we needed, or where we lacked priveleges. -So external dependencies are managed explicitly. - -The software requires a gcc version of at least version 10. This version of LillyMol -uses some fairly recent c++ features, which require a recent compiler. - -If you use the module system -``` -module load gcc10 -module load bazelisk -``` +not be updated to the versions we needed, or where we lacked privileges, or... +So external dependencies are downloaded and managed explicitly. The preferred way of using third party software is via the Bazel Module system. Most of the external dependencies needed are handled via that mechanism. Today that includes - **absl**: Google's c++ library - we use crc32c and some data structures. -- **googletest**: c++ unit tests -- **protobuf**: handling of protocol buffers +- **eigen**: matrix operations +- **googletest**: Google's c++ unit tests +- **protobuf**: Google's Protocol Buffers - **re2**: Google's regular expression library +- **tbb**: Threaded Building Blocks for multi-threading - **zlib**: compression The complete listing is in the file [MODULE.bazel](src/MODULE.bazel). - Other third party dependencies are downloaded and built by the [build_third_party.sh](src/build_third_party.sh) script, which will create a `third_party` -directory and build the following dependencies. +directory (next to src) and then download, build and install the following dependencies - **BerkeleyDb**: used for key/value databases - **f2c/libf2c**: there is some fortran in LillyMol. +- **HighwayHash**: hash function from Google -The `build_third_party.sh` script will download, configure, build and install -the requisite third party tools. -See the `WORKSPACE` file if you would prefer to do a local install of -those tools instead. The difference is that if you have bazel silently -handle those, they are not readily available to you if you decide you -need them for other purposes. Doing a local install will also avoid -possibly needless recompilations. - -By default the third_party tools are installed next to the `src` directory. - -Note that installing these external dependencies may require considerable -amounts of disk space. For example at the time of writing my bazel -temporary area contains 847MB. - -Note too that there are some third party dependencies that are made -part of the LillyMol repo, xmlParser, jama, tnt, and various code -snippets. +Running 'build_third_party.sh' needs to be done once. -`WORKSPACE` configures the build environment for `bazel`. The absolute path of -the dependencies must be configured in that file. Wherever you see a `path=` -directive in WORKSPACE, that just be updated to reflect where the repo -is on your system. The `build_third_party` script does attempt to generate -an updated WORKSPACE file. At the end of that script, it places a possibly -useful new WORKSPACE file in `/tmp`. It is up to you to review that file, and -if it looks OK, copy it to the `src` directory, overwriting the existing -WORKSPACE file. The WORKSPACE file that is in the repo will **not** work. +Currently HighwayHash is impeding deployment on Mac's. -If some third party tools do not build, you may be able to skip building -them during the build by use of --build_tag_filters=. For example to *not* -build any tool that involves BerkeleyDb `--build_tag_filters=-berkeleydb` -should do that. Tags are specified in the respective BUILD files. - -``` -cd src -./build_third_party.sh # takes a while -ls -l /tmp/WORKSPACE # should have just been created -vi /tmp/WORKSPACE # inspect and update if needed -cp /tmp/WORKSPACE WORKSPACE # press the new version into service. -``` -If you are lucky, the WORKSPACE file in /tmp will require no changes. - -There is an install target in the BUILD files, and defined in [build_deps/install.bzl](src/build_deps/install.bzl). -This is used to copy built executables to a pre-defined location. There are -two ways of specifying this. - -1. hard code the directory into the `default = ""` specification at the bottom of - `install.bzl` -2. use the `--action_env=` directive below to specify BINDIR. - -Generally it is easier to do a one-time change to install.bzl, although you then -need to remember to not commit your install path to the repo. Running `build_third_party.sh` -will again create what is likely to be an ok version of this file in `/tmp/install.bzl`. If -it looks OK, copy it to the `build_deps` directory. +Note that BerkeleyDB and Python bindings are only built if requested. +In [Makefile](/Makefile) you will see use of the shell variables +'BUILD_PYTHON' and 'BUILD_BDB' which if set, enables building of +these optional features. These can be set any time. Running `build_third_party.sh` may be a lengthy process. It can be re-run at any time thereafter. For those repos that are cloned GitHub repos, it will @@ -160,96 +152,142 @@ re-run the script and all dependencies are downloaded and rebuilt. If there is an individual dependency that you would like to rebuild, just remove it from the `third_party` directory, run the script again and it will be rebuilt. -Note that [.bazelrc](src/.bazelrc) contains a hardware restriction to quite old +Note that [.bazelrc](/src/.bazelrc) contains a hardware restriction to quite old Intel hardware. You should update update `--cxxopt` to reflect your hardware. Using `--cxxopt=-march=native --cxxopt=-mtune=native` is likely what you want. Build for the local hardware. -## Building -When building for release, it is convenient to include the git hash and -the date of the build in -the executables. Make sure you are building from a clean repo. +`WORKSPACE` configures the build environment for `bazel`. The path +to the external dependencies must be configured in that file. They +can be either full path names, or path names relative to the main +WORKSPACE file. In the WORKSPACE file in this distribution, there is a mixture, with +many of the dependencies in the `../third_party` directory, and +others with Lilly specific full path names. You may need to +update WORKSPACE for local needs. + +Note that installing these external dependencies and running bazel may require +considerable amounts of disk space. For example at the time of writing my +'third_party' directory contains 1.2GB and my bazel temporary area contains 2.2GB. -Bazel needs to be able to store its cache on a local disk. When building +### Installation Directory +There is an 'install' target in the BUILD files, and defined in +[build_deps/install.bzl](src/build_deps/install.bzl). +This is where LillyMol executables will be installed when +the 'install' run target is run. + +'build_third_party.sh' changes the default location for executables +to be '/path/to/LillyMol/bin/$(uname)'. Check to see that the update has +been done correctly and adjust if not, or to set another location. + +``` +tail build_deps/install.bzl +``` +That file contains other mechanisms for specifying the install directory. +But remember, every time `build_third_party.sh` runs it will change +this file. + +### Python Bindings +During building of external dependencies (with build_third_party.sh +and if BUILD_PYTHON is set) +the script `update_python_in_workspace.py` will examine your python +installation and get information about the include path. With that +info it will update WORKSPACE with new values for the 'path' +attributes of the python related features. + +Note that if it does not find a pybind11 installation, the build +will continue, but the python related parts of the build will subsequently fail. + +You can of course manually update WORKSPACE to point to your +python installation. See the 'new_local_repository' sections for 'python' +and 'pybind11' + +Note that we recently observed a change in how shared +libraries are handled by bazel. For now, there is a .bazelversion file that +freezes the bazel version until we figure out how to handle shared libraries +with newer versions of bazel. Having a .bazelversion file makes use of bazelisk +superfluous, but once we figure out the new shared library stuff, the bazel +version will again be allowed to float via bazelisk. The current way +shared libraries are handled is not ideal, and causes some undesirable +behaviour in LillyMol/python. + +# Build +Once the third party dependencies have been built, and WORKSPACE and +install.bzl configured, LillyMol building can begin. + +Bazel needs to be able to store its cache on a local disk, *not* NFS. When building inside Lilly, I have used `--output_user_root=/node/scratch/${USER}` to use local scratch storage for bazel's cache. Note that if there is a recycling policy in place for the cache, you may see unexpected outcomes. -Remove the cache completely to start afresh. +Purge the cache completely to start afresh. + +If outside Lilly, the 'build_from_src.sh' script (below) will check to +see if your HOME directory is on an NFS mounted file system, and if so, will +specify /tmp for bazel's cache. This is almost certainly not what you want, +so edit 'build_from_src.sh' to specify a local directory for +`--output_user_root`. Again, only needed if you are on an NFS file system. +You can also enter this value in bazel's configuration file `.bazelrc`. By default, bazel will use all cores available on the local machine. -If needed, limit the number of cores with the `--jobs` option. +If needed, limit the number of cores with the `--jobs` option inside +'build_from_src.sh' (sorry no command line options here). + +Optionally set shell variables BUILD_BDB and BUILD_PYTHON to enable +building of optional features. + +Once the bazel preconditions are set, do the build, test and installs +``` +cd src # you might already be here +./build_from_src.sh # takes a while +``` -There is an install run target built into the BUILD files, and you must -decide upon the directory to which that target should copy executables. -See previous section. +The script will + +1. run the C++ unit tests, +2. build all executables +3. build the python bindings +4. install executables into the `/path/to/LillyMol/bin/$(uname)` directory (build_deps/install.bzl) +5. copy python related shared libraries to /path/to/LillyMol/lib (if BUILD_PYTHON) +6. run python unit tests (if BUILD_PYTHON) -While there is a script that should do the build for you, underneath these -are the commands being issued. Skip to the next section unless interested. +Step 5 is done via the [copy_shared_libraries.sh](/src/copy_shared_libraries.sh) +script. It also copies some python compiled protos. Adjust as needed. -A typical build command might be (change the path for test_env) +For anyone interesting in doing their own development, a typical build +inside Lilly might be (change the path for test_env) ``` bazelisk --output_user_root=/node/scratch/${USER} build --jobs=8 - --enable_bzlmod - --experimental_cc_shared_library -c opt --cxxopt=-DGIT_HASH=\"$(git rev-parse --short --verify HEAD)\" --cxxopt=-DTODAY=\"$(date +%Y-%b-%d)\" - //Molecule_Tools:all <- targets listed below - --action_env=BINDIR=/path/for/binaries - --test_env=C3TK_DATA_PERSISTENT=/full/path/to/LillyMolQueries + --test_env=${C3TK_DATA_PERSISTENT}=/full/path/to/LillyMolQueries + Molecule_Tools:all <- or some other target ``` -Again, the binary installation directory can be either specified here, or hard coded in -`install.bzl`. If hard coded in `install.bzl` omit the `--action_env` option - that is -what I do. - -Note that with the advent of python bindings, we observed a change in how shared -libraries are handled by bazel. For now, there is a .bazelversion file that -freezes the bazel version until we figure out how to handle shared libraries -with newer versions of bazel. Having a .bazelversion file makes use of bazelisk -superfluous, but once we figure out the new shared library stuff, the bazel -version will be allowed to float via bazelisk. - -## Targets to Test and Build - -First run `build_third_party.sh` to ensure dependencies are built. - -Actual tests, builds and installs can be handled by the `build_from_src.sh` script. +Most will want to put this in a small shell script, and/or add to .bazelrc where +possible. -The script `build_from_src.sh` will - -1. run the C++ unit tests, -2. build all executables -3. install executables into the `bin/Linux` directory (build_deps/install.bzl) +When building for release, it is convenient to include the git hash and +the date of the build in the executables. That is not necessary, omit those if not needed. +Note that because the date is included with cxxopt, this _will_ cause a daily +recompile. While this is hardly desirable, the benefits are many. ## cmake -There is `cmake` infrastructure -included, but that may, or may not, work - within Lilly we have not -been able to make it work, usually as a result of conflicting protcol buffer -versions on the system, but externally it often works, although it has not -been tested recently. +The distribution contains `cmake` infrastructure, that is currently +not functional. Within Lilly we have not been able to make it work, +usually as a result of conflicting protcol buffer versions on the +system. Work is ongoing to get cmake working for the public release. -## Recipe to build (inside Lilly). +## Overall Recipe to Build (inside Lilly). ```bash module load gcc10 module load bazelisk -cd ./src - -# Do these steps once -./build_third_party.sh -# Examine /tmp/WORKSPACE -# cp /tmp/WORKSPACE WORKSPACE -# Examine /tmp/install.bzl -# cp /tmp/install.bzl build_deps -./build_from_src.sh +module load git +# ensure 'python' invokes to a suitable version, install requirements if needed +# pip install pybind11 absl-py protobuf +make python berkeleydb -# Rebuild Molecule_Tools any time -bazelisk --output_user_root=/node/scratch/$USER build --jobs=8 --enable_bzlmod --experimental_cc_shared_library -c opt --cxxopt=-DGIT_HASH=\"$(git rev-parse --short --verify HEAD)\" --cxxopt=-DTODAY=\"$(date +%Y-%b-%d)\" //Molecule_Tools:all --test_env=C3TK_DATA_PERSISTENT=/full/path/to/LillyMol/queries -``` -Note that because the date is included with cxxopt, this _will_ cause a daily -recompile. While this is hardly desirable, knowing when an executable was compiled -can be useful. \ No newline at end of file +# copy executables and library files out of the repo to their final destination. diff --git a/README_OSX.md b/README_OSX.md deleted file mode 100644 index 76e480c8..00000000 --- a/README_OSX.md +++ /dev/null @@ -1,106 +0,0 @@ -######################################################################################## - Warning: -Please pay special attention to the order of arguments and options when -you are running command under Mac -1. All the command options shall be placed right after the command name. -2. All the other input information for the command shall be appended to the end of the command after options -Sample: -fetch_smiles_quick -j -c 1 -C 2 -X notInRecord -Y notInIdentifier record.w structures.sm - -######################################################################################## - - -Welcome to the Eli Lilly LillyMol implementation. - -REQUIREMENT: - -This software requires following packages to build -1. GCC >= 6.2.0 (see https://gcc.gnu.org/install/index.html) -Example command to intall gcc: `brew install gcc` - -2. zlib >= 1.2.11 (see http://www.zlib.net/) -Example command to install zlib: `brew install zlib` -You need to define the location for zlib.a in makefile.public.* - -3. Eigen >= 3.3.7 (see http://eigen.tuxfamily.org/index.php?title=Main_Page) -Download and unzip Eigen from the above link -You need to define the include location for Eigen in makefile.public.* - - - -Note: -Following command can be used to install commandline build tool on Mac OS X -`xcode-select --install` - -Following command can be used to install the homebrew tool if it does not exist -`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` - -BUILD: -1. Start terminal - -2. Pull down the code from repo - -3. Enter the root directory of the code - -4. Update the path for the zlib in the makefile.public.OSX-gcc-8 - -5. Run makeall_osx.sh (Skip rest of the steps if you run this command) - -6. Export compilers - * `export CC=gcc-8` - * `export CXX=g++-8` - * `export FC=gfortran-8` - -7. Export the UNAME for makefile - * `export UNAME=OSX-gcc-8` - - -8. Alternatively, you can run following commands: -```bash - make veryclean - make copy_include - make library - make copy_library - make exe - make copy_exe -``` - -EXECUTION: -See Wiki page for sample commands -See the example folder for data used in the sample commands -Example to verify a generated command: -```bash - cd bin/OSX-gcc-8/ - ./common_names -``` -Note: This command shall print out the help menu on screen if it is built successfully - This approach can be used to verify if each command is built successfully -Example to run sample commands: -```bash - cd example/common_names/ - ../../bin/OSX-gcc-8/common_names input1.smi input2.smi -S ./output -s 10000 -r 10000 -D + -v -``` - - -DIRECTORY: -src: source code -example: data for sample commands (see Wiki page) -test: test scripts for each command -bin(generated after build): all generated executables -lib(generated after build): all generated library files -include(generated after build): shared include files -contrib: legacy tools - - -TEST: -See the test folder for the test case for each command -Example to run a test: -``` - cd test/common_names/case_1/ - ./test_case_1.sh -``` -Note: Test shall print out TEST PASS if it is successful, otherwise it shall - print out TEST FAIL - -LICENSE: -Consult the LICENSE file for details of the license diff --git a/RELEASE_NOTES b/RELEASE_NOTES deleted file mode 100644 index cdc61374..00000000 --- a/RELEASE_NOTES +++ /dev/null @@ -1,715 +0,0 @@ -2023-10 Release 7.0 - -Significant update with many newly available tools. - -Documentation of LillyMol and of individual tools is taking form, see the -docs subdirectory. More work remains to be done there. Within the docs -directory, the Workflows directory contains some hopefully helpful recipes -for performing various useful tasks with LillyMol tools. - -All GoogleTest unit tests pass with --config=asan so memory management is -mostly clean. - -New source files. -=========== -./Foundational/data_source/iwstring_data_source_test.cc -./Foundational/data_source/proto_for_testing.proto -./Foundational/data_source/test_tfdata_record.cc -./Foundational/data_source/tfdatarecord.cc -./Foundational/data_source/tfdatarecord.h -./Foundational/iwaray/iwaray_test.cc -./Foundational/iwbits/fixed_bit_vector.cc -./Foundational/iwbits/fixed_bit_vector.h -./Foundational/iwbits/fixed_bit_vector_benchmark.cc -./Foundational/iwbits/fixed_bit_vector_test.cc -./Foundational/iwmisc/combinations.h -./Foundational/iwmisc/combinations_test.cc -./Foundational/iwmisc/fname.cc -./Foundational/iwmisc/iwdigits_test.cc -./Foundational/iwmisc/iwdirname.cc -./Foundational/iwmisc/iwre2.cc -./Foundational/iwmisc/iwre2.h -./Foundational/iwmisc/iwre2_test.cc -./Foundational/iwmisc/matcher.h -./Foundational/iwmisc/matcher_test.cc -./Foundational/iwmisc/memoized_floats.cc -./Foundational/iwmisc/memoized_floats.h -./Foundational/iwmisc/memoized_floats_benchmark.cc -./Foundational/iwmisc/memoized_floats_test.cc -./Foundational/iwmisc/proto.cc -./Foundational/iwmisc/proto_support.cc -./Foundational/iwmisc/proto_support.h -./Foundational/iwstring/absl_hash.cc -./Foundational/iwstring/absl_hash.h -./Foundational/iwstring/iwstring_test.cc -./Foundational/iwstring/tspassbyref.cc -./Foundational/string_data_source/iwstring_string_data_source_test.cc -./Molecule_Lib/aromatic_test.cc -./Molecule_Lib/atom_pair_fingerprint.cc -./Molecule_Lib/atom_pair_fingerprint.h -./Molecule_Lib/atom_pair_fingerprint_test.cc -./Molecule_Lib/atom_test.cc -./Molecule_Lib/atom_type_ext.proto -./Molecule_Lib/coordinate_box.cc -./Molecule_Lib/coordinate_box.h -./Molecule_Lib/coordinate_box.proto -./Molecule_Lib/coordinate_box_test.cc -./Molecule_Lib/csv.cc -./Molecule_Lib/dihedral_test.cc -./Molecule_Lib/donor_acceptor.proto -./Molecule_Lib/donor_acceptor_test.cc -./Molecule_Lib/down_the_bond.cc -./Molecule_Lib/ec_fingerprint.cc -./Molecule_Lib/ec_fingerprint.h -./Molecule_Lib/ec_fingerprint_test.cc -./Molecule_Lib/element_hits_needed_test.cc -./Molecule_Lib/f2c.h -./Molecule_Lib/frag_test.cc -./Molecule_Lib/geometric_constraints.cc -./Molecule_Lib/geometric_constraints.h -./Molecule_Lib/geometric_constraints.proto -./Molecule_Lib/geometric_constraints_test.cc -./Molecule_Lib/iwreaction_test.cc -./Molecule_Lib/linear_fingerprint.cc -./Molecule_Lib/linear_fingerprint.h -./Molecule_Lib/linear_fingerprint_test.cc -./Molecule_Lib/misc2_test.cc -./Molecule_Lib/moe.cc -./Molecule_Lib/mol2graph.cc -./Molecule_Lib/mol2graph.h -./Molecule_Lib/mol2graph.proto -./Molecule_Lib/mol2graph_proto.cc -./Molecule_Lib/mol2graph_proto.h -./Molecule_Lib/molecule_each_index_test.cc -./Molecule_Lib/molecule_test.cc -./Molecule_Lib/moleculeh_test.cc -./Molecule_Lib/qry_wstats.cc -./Molecule_Lib/reaction.proto -./Molecule_Lib/reaction_proto.cc -./Molecule_Lib/ring_bond_count_test.cc -./Molecule_Lib/rwsubstructure_proto.cc -./Molecule_Lib/rxnfile2_test.cc -./Molecule_Lib/rxnfile_test.cc -./Molecule_Lib/smi_test.cc -./Molecule_Lib/smiles_test.cc -./Molecule_Lib/sort_atoms.cc -./Molecule_Lib/space_vector_test.cc -./Molecule_Lib/ss_bonds_test.cc -./Molecule_Lib/ss_ring_base_test.cc -./Molecule_Lib/ss_ring_test.cc -./Molecule_Lib/standardise.h -./Molecule_Lib/standardise_test.cc -./Molecule_Lib/substructure.proto -./Molecule_Lib/substructure_dtb_test.cc -./Molecule_Lib/substructure_env_test.cc -./Molecule_Lib/substructure_mam_test.cc -./Molecule_Lib/substructure_nmab_test.cc -./Molecule_Lib/substructure_ring_system_test.cc -./Molecule_Lib/substructure_ring_test.cc -./Molecule_Lib/substructure_sepma_test.cc -./Molecule_Lib/substructure_single_query_test.cc -./Molecule_Lib/substructure_smarts_test.cc -./Molecule_Lib/substructure_spec_test.cc -./Molecule_Lib/substructure_test.cc -./Molecule_Lib/symmetry_test.cc -./Molecule_Lib/toggle_kekule_form.proto -./Molecule_Lib/u3b.c -./Molecule_Lib/unique_test.cc -./Molecule_Lib/xyz.cc -./Molecule_Tools/align_molecule.cc -./Molecule_Tools/atom_pair_fingerprint_main.cc -./Molecule_Tools/atom_triples.cc -./Molecule_Tools/buildsmidb_bdb.cc -./Molecule_Tools/buildsmidb_leveldb.cc -./Molecule_Tools/circular_fingerprint.cc -./Molecule_Tools/circular_fingerprint.h -./Molecule_Tools/common_names.proto -./Molecule_Tools/demerit.proto -./Molecule_Tools/dicer_fragment_lookup_bdb.cc -./Molecule_Tools/dicer_fragment_overlap.cc -./Molecule_Tools/dicer_fragments.proto -./Molecule_Tools/dicer_fragments_collate.py -./Molecule_Tools/e_state_computation_procedure.cc -./Molecule_Tools/e_state_computation_procedure.h -./Molecule_Tools/e_state_computation_procedure_ori.cc -./Molecule_Tools/e_state_computation_procedure_ori.h -./Molecule_Tools/ec_fingerprint_main.cc -./Molecule_Tools/echoqry.cc -./Molecule_Tools/element_density.cc -./Molecule_Tools/excise_3d_overlap.cc -./Molecule_Tools/extended_atom_pairs.cc -./Molecule_Tools/extended_pi.cc -./Molecule_Tools/extended_pi.h -./Molecule_Tools/extended_pi_test.cc -./Molecule_Tools/fileconv_opts.cc -./Molecule_Tools/fileconv_opts.h -./Molecule_Tools/fileconv_test.cc -./Molecule_Tools/fingerprint_substructure.cc -./Molecule_Tools/fingerprint_writer.cc -./Molecule_Tools/fingerprint_writer.h -./Molecule_Tools/firstatom.cc -./Molecule_Tools/fragment_filter.cc -./Molecule_Tools/geometric_descriptors.cc -./Molecule_Tools/get_coordinates.cc -./Molecule_Tools/get_linkers.cc -./Molecule_Tools/get_substituents.cc -./Molecule_Tools/gfp_erg.cc -./Molecule_Tools/ghose_crippen.cc -./Molecule_Tools/grease.cc -./Molecule_Tools/grid_fingerprint.cc -./Molecule_Tools/grid_proximity.cc -./Molecule_Tools/id_chirality.cc -./Molecule_Tools/in_database_bdb.cc -./Molecule_Tools/in_database_leveldb.cc -./Molecule_Tools/insight_grid.cc -./Molecule_Tools/insight_grid.h -./Molecule_Tools/introduction.cc -./Molecule_Tools/iwdemerit_lib.cc -./Molecule_Tools/iwdemerit_lib.h -./Molecule_Tools/iwdemerit_lib_test.cc -./Molecule_Tools/iwdescr.proto -./Molecule_Tools/iwecfp_database.cc -./Molecule_Tools/iwecfp_database.h -./Molecule_Tools/iwecfp_database_load.cc -./Molecule_Tools/iwecfp_database_lookup.cc -./Molecule_Tools/iwpathd.cc -./Molecule_Tools/jw_DiP.cc -./Molecule_Tools/jw_MEDV13.cc -./Molecule_Tools/jw_common_alignment.cc -./Molecule_Tools/jw_common_alignment.h -./Molecule_Tools/jw_distribution_along_longest_axis.cc -./Molecule_Tools/jw_molconn.cc -./Molecule_Tools/jw_path_with_values.cc -./Molecule_Tools/jw_path_with_values.h -./Molecule_Tools/jwcats.cc -./Molecule_Tools/jwestate.cc -./Molecule_Tools/jwmorse.cc -./Molecule_Tools/ligand_protein_interactions.cc -./Molecule_Tools/ligand_protein_interactions.proto -./Molecule_Tools/linear_fingerprint_main.cc -./Molecule_Tools/long_molecules.cc -./Molecule_Tools/make_these_molecules.proto -./Molecule_Tools/marvin_pka.cc -./Molecule_Tools/medchem_rules_summary.py -./Molecule_Tools/medchemwizard.cc -./Molecule_Tools/minor_changes.cc -./Molecule_Tools/minor_changes.h -./Molecule_Tools/minor_changes.proto -./Molecule_Tools/minor_changes_main.cc -./Molecule_Tools/minor_changes_test.cc -./Molecule_Tools/mkfrag.cc -./Molecule_Tools/molecular_grid.cc -./Molecule_Tools/molecular_merge.cc -./Molecule_Tools/molecular_variants.cc -./Molecule_Tools/molecule_database_options.cc -./Molecule_Tools/molecule_database_options.h -./Molecule_Tools/molecule_database_options.proto -./Molecule_Tools/msort_parallel.cc -./Molecule_Tools/multiple_reactions.cc -./Molecule_Tools/numbered_smiles.cc -./Molecule_Tools/partial_symmetry.cc -./Molecule_Tools/partial_symmetry.h -./Molecule_Tools/partial_symmetry_test.cc -./Molecule_Tools/pharmacaphore_2d.cc -./Molecule_Tools/psafp.cc -./Molecule_Tools/pubchem_fingerprints.cc -./Molecule_Tools/r1r2etc.cc -./Molecule_Tools/random_geometric_changes.cc -./Molecule_Tools/random_molecular_permutations.proto -./Molecule_Tools/reduced_graph.cc -./Molecule_Tools/reduced_graph.proto -./Molecule_Tools/remove_duplicate_fragments.cc -./Molecule_Tools/remove_duplicate_fragments.h -./Molecule_Tools/retrosynthesis.proto -./Molecule_Tools/ring_closure.cc -./Molecule_Tools/ring_closure.h -./Molecule_Tools/ring_closure.proto -./Molecule_Tools/ring_closure_main.cc -./Molecule_Tools/ring_ext_rep_test.cc -./Molecule_Tools/ring_size_fingerprint.cc -./Molecule_Tools/rxn_reverse.cc -./Molecule_Tools/rxn_to_openrxn.cc -./Molecule_Tools/rxn_to_openrxn.h -./Molecule_Tools/rxn_to_openrxn_main.cc -./Molecule_Tools/rxn_to_openrxn_test.cc -./Molecule_Tools/same_structures.cc -./Molecule_Tools/skeleton.cc -./Molecule_Tools/smi2linker.cc -./Molecule_Tools/smi2rings.proto -./Molecule_Tools/smi2rings_bdb.cc -./Molecule_Tools/smolvol.c -./Molecule_Tools/spatial_replacement.cc -./Molecule_Tools/storage_conditions.cc -./Molecule_Tools/storage_conditions.h -./Molecule_Tools/substituent_identification.cc -./Molecule_Tools/substructure_match_fraction.cc -./Molecule_Tools/substructure_mcs.cc -./Molecule_Tools/superimpose_by_matched_atoms.cc -./Molecule_Tools/topological_torsion.cc -./Molecule_Tools/topological_torsion.h -./Molecule_Tools/topological_torsion_main.cc -./Molecule_Tools/topological_torsion_test.cc -./Molecule_Tools/tp1_summarise.cc -./Molecule_Tools/tp_first_pass_lib.cc -./Molecule_Tools/tp_first_pass_lib.h -./Molecule_Tools/tp_first_pass_test.cc -./Molecule_Tools/tsmiles.cc -./Molecule_Tools/tstandardise.cc -./Molecule_Tools/tsubstructure.proto -./Molecule_Tools/tsubstructure_fp.cc -./Molecule_Tools/tsubstructure_summarise_hits.cc -./Molecule_Tools/tsymmetry.cc -./Utilities/BerkeleyDB/iwbdb_cat.cc -./Utilities/BerkeleyDB/iwbdb_compare.cc -./Utilities/BerkeleyDB/iwbdb_delete.cc -./Utilities/BerkeleyDB/iwbdb_exists.cc -./Utilities/BerkeleyDB/iwbdb_fetch.cc -./Utilities/BerkeleyDB/iwbdb_list.cc -./Utilities/BerkeleyDB/iwbdb_load.cc -./Utilities/BerkeleyDB/unpack_data.cc -./Utilities/BerkeleyDB/unpack_data.h -./Utilities/Distance_Matrix/distance_matrix_leader.cc -./Utilities/Distance_Matrix/distance_matrix_nn.cc -./Utilities/GFP_Tools/bit_subset.cc -./Utilities/GFP_Tools/bit_subset.h -./Utilities/GFP_Tools/bit_subset_test.cc -./Utilities/GFP_Tools/demo_nearneighbours_proto.py -./Utilities/GFP_Tools/evidence.cc -./Utilities/GFP_Tools/evidence.proto -./Utilities/GFP_Tools/gfp_catboost_score.cc -./Utilities/GFP_Tools/gfp_bit_subset.cc -./Utilities/GFP_Tools/gfp_flatten_counted.cc -./Utilities/GFP_Tools/gfp_histogram.cc -./Utilities/GFP_Tools/gfp_incremental_diversity.cc -./Utilities/GFP_Tools/gfp_iterative_expansion.cc -./Utilities/GFP_Tools/gfp_leader_multiple_threshold.cc -./Utilities/GFP_Tools/gfp_leader_tbb.cc -./Utilities/GFP_Tools/gfp_leader_threaded_mpi.cc -./Utilities/GFP_Tools/gfp_mcs.cc -./Utilities/GFP_Tools/gfp_model.proto -./Utilities/GFP_Tools/gfp_nearneighbours_single_file_tbb.cc -./Utilities/GFP_Tools/gfp_spread_buckets.cc -./Utilities/GFP_Tools/gfp_spread_omp.cc -./Utilities/GFP_Tools/gfp_svmfl_score.cc -./Utilities/GFP_Tools/gfp_standalone.cc -./Utilities/GFP_Tools/gfp_standalone.h -./Utilities/GFP_Tools/gfp_to_svm_lite.proto -./Utilities/GFP_Tools/gfp_to_svm_lite.v2.cc -./Utilities/GFP_Tools/gfp_to_svm_lite_v3.cc -./Utilities/GFP_Tools/leader_parallel.cc -./Utilities/GFP_Tools/leader_parallel.h -./Utilities/GFP_Tools/nearneighbours.proto -./Utilities/GFP_Tools/nn2csv.cc -./Utilities/GFP_Tools/nn2proto.cc -./Utilities/GFP_Tools/nn_fixed_size_cluster.cc -./Utilities/GFP_Tools/nn_merge.cc -./Utilities/GFP_Tools/nndata.cc -./Utilities/GFP_Tools/nndata.h -./Utilities/GFP_Tools/parallel_nn_search_to_gfp_spread.cc -./Utilities/GFP_Tools/plate_layout.cc -./Utilities/GFP_Tools/sparsefp_benchmark.cc -./Utilities/GFP_Tools/sparsefp_test.cc -./Utilities/GFP_Tools/svm_lite_model.proto -./Utilities/GFP_Tools/test_sparse_bitvector_performance.cc -./Utilities/GFP_Tools/train_test_split_optimise.cc -./Utilities/General/bucketise.cc -./Utilities/General/byte_offset_index.cc -./Utilities/General/catboost_options.proto -./Utilities/General/class_label_translation.cc -./Utilities/General/class_label_translation.proto -./Utilities/General/correlate.cc -./Utilities/General/descriptor_file_cat.cc -./Utilities/General/descriptor_file_filter.cc -./Utilities/General/descriptor_file_select_rows.cc -./Utilities/General/descriptor_file_sort.cc -./Utilities/General/descriptor_file_to_svm_lite.cc -./Utilities/General/descriptor_file_transpose.cc -./Utilities/General/dicer_fragments_collate.cc -./Utilities/General/distribution.cc -./Utilities/General/feature_scaling.cc -./Utilities/General/feature_scaling.proto -./Utilities/General/feature_scaling_create.py -./Utilities/General/fetch_sdf.cc -./Utilities/General/fetch_smiles.cc -./Utilities/General/grid_overlap.cc -./Utilities/General/jfilecompare.cc -./Utilities/General/kstat_correlated.cc -./Utilities/General/mispredicted.cc -./Utilities/General/model_average.cc -./Utilities/General/running_average.cc -./Utilities/General/scaler.cc -./Utilities/General/scaler.h -./Utilities/General/scaler_test.cc -./Utilities/General/shuffle_file.cc -./Utilities/General/stratified_samples.cc -./Utilities/General/svm_lite_to_gfp.cc -./Utilities/General/test_train_split_classification.cc -./Utilities/General/test_train_split_from_leader.cc -./Utilities/General/ttitem.cc -./Utilities/General/ttitem.h -./build_from_src.sh -./build_third_party.sh - -Retired scripts -=============== - -Bug fixes -========= -Many. - - -Data -========= -Pubchem fingerprint query files. -Reduced graph reactions. -ErG query specifications. -Molecular Variants queries. - -Lib -========= - - -Updates -======= -The major update here is many new tools available, and the build system is -now done with bazel. Building is more complex since there are now several third -party dependencies. Substructures and reactions are now specified in Protocol -Buffer text_format form. The old query and reaction files continue to work. - - -Known issues -============ - - -2020-01 Release 6.0 - -New scripts -=========== -Under: contrib->script->py->mmp -getMMPfromSMI.py - For an input SMILES file, generate a CSV of Matched Molecular Pairs -getMMPStatsfromCSV.py - For an input CSV file, generate a CSV of Matched Molecular Pairs with associated delta for the given data column(s) -getMMPbasedMCSSfromSMI.py - For an input SMILES file, generate a CSV of the MMP that has the smallest change between the two molecules (by atom count) -getMMPEnumeratedNewMols.py - For an input SMI file, mutate the molecule to create new idea molecules based on a prebuilt or custom set of Transforms -getMMPSeriesfromCSV.py - For an input CSV file, generate a CSV of any Matched Molecular Series -getMMPSeriesSuggestfromCSV.py- For an input SMI file, generate all matched series, then search for any series that can be extended by an equivalent series in the same set - -Retired scripts -=============== - - -Bug fixes -========= - - -Data -========= - - -Lib -========= - - -Updates -======= - -Known issues -============ - - -2019-12 Release 5.0 - -New scripts -=========== -abraham - Compute Abraham descriptors -distance_matrix_spread - Spread implementation, distances from a distance matrix file -distance_matrix_from_distances - Produce a distance matrix file using distance data from file -iwecfp_intermolecular - Compute protein-ligand interaction fingerprints. Three main types of fingerprints have been implemented: ecfp, path and atom pairs. For ecfp fingerprints, bits represents a circular substructure from the ligand and a circular substructure from the protein (both central atoms from the ligand and the protein must be within a given distance threshold). It is possible to change the radius shell (on both ligand and protein), the distance cut-off between ligand and protein atoms, limit the number of atoms in the protein substructure, to atom types, the atom relationship (atom pairs and atom paths)... -tshadow - Compute shadow area for molecule - -Retired scripts -=============== - - -Bug fixes -========= - - -Data -========= - - -Lib -========= - - -Updates -======= - -Known issues -============ - - -2019-10 Release 4.0 - -New scripts -=========== -dbf - Computes topological and/or 3D distances between features -dicer - Structure fragmentation tool which can optionally use a query fle -hydrophobic_sections - Hydrophobic section descriptors -iwdescr - Calculate 200+ descriptors from a SMILES file -iwecfp - Extended Connectivity fingerprints for molecules -iwfp - Hashed path based fingerprints from SMILES file -jwsadb - Calculate charge surface area related descriptors for molecules -maccskeys - Generate MACCS keys -make_these_molecules - Structure enumeration using SMILES and specific reagents. Uses a rxn file, a reagents ID file and two reagent SMILES files. -molecular_abstraction - Performs molecular transformations associated with various molecular abstractions -molecular_transformations - Performs any number of molecular transformations on input molecules using reactions supplied -molecules_from_reagents - Synthesize molecules from isotopically labelled reactant sets; returns those identical to seeds in a given file -random_molecular_permutations - Chemistry aware molecular perturbation tool -remove_and_label - Removes atoms and isotopically labels the adjacent atoms -remove_matched_atoms - Strips fragments/matched atoms from molecules; can be used in place of a simple de-protection reaction -ring_fingerprint - Computes fingerprints based on ring properties, primarily aromatic rings -ring_replacement - Companion program to ring_extraction -ring_substitution - Computes ring substitution fingerprints -rule_of_five - Computes Pfizer/Lipinski rule-of-five on molecules in input file. Returns molecule id and the values of the properties calculated. -rxn_fingerprint - Takes a rxnsmi file, and generates reaction fingerprints -substitutions - Calculate rtable given a scaffold and a set of compounds -temperature - Computes 'temperature' descriptors -tnass - Does substructure searches with NEED/AVAILABLE flags -average - Compute the statistics on columns in a file. -dfilefilter - Filter a descriptor file with expressions of the descriptors -distribution - Calculate the distribution based on the input data set. -fetch_sdf_quick - Fetch records from one file based on the identifiers in another file -iwsplit - Splits a file into chunks based on regular expressions -normalise - Normalize the columns in a file -notenoughvariance - Filter out the data record without enough variance on columns -random_records - Randomly select records from the provided file -rearrange_columns - Rearrange the columns in one descriptor file to look like another descriptor file -tcount - Count number of lines, columns in a file -whatsmissing - Identifies missing descriptors from a descriptor file -gfp_distance_matrix_iwdm - Computes the distance matrix for a pool of gfp fingerprints; generates a binary file -gfp_leader_standard - Leader clustering implementation requiring MPR IW MK MK2 -gfp_lnearneighbours_standard - Find the near neighbours between fingerprints -gfp_spread_standard - Do a spread design on fingerprint descriptors -gfp_to_descriptors_multiple - Converts multi component fingerprints to descriptors -iwstats - Computes Bsquared and other statistics for input file -nn_leader_and_jp - Performs Leader, Taylor-Butina, Jarvis-Patrick clustering starting from a tdt-formatted near-neighbour list -gfp_naive_bayesian - Naive Bayes predictive model training and prediction - - -Retired scripts -=============== - - -Bug fixes -========= - - -Data -========= - - -Lib -========= - - - -Updates -======= - -Known issues -============ -The generated fingerprints can not be shared across OS's - - - -2019-04 Release 3.0 - -New scripts -=========== -gfp_add_descriptors - Adds descriptors to the gfp file with matching ID -gfp_lnearneighbours - Selects near neighbour based on gfp descriptors, uses SMILES, can handle LARGE numbers of cpds -gfp_to_descriptors - Converts fingerprints to descriptors -gfp_profile_activity_by_bits - Scans a fingerprint file and computes average activity associated with each bit -gfp_pairwise_distances - Calculates the pairwise distance between molecule -gfp_distance_filter - Filters molecules according to how close they are to members of a comparison pool -gfp_sparse_to_fixed - Converts non-colliding fingerprints to fixed counted, or binary forms -gfp_spread_v2 - Calculates the distance spread of fingerprints against target fingerprint or group of fingerprints -gfp_single_linkage - Finds the single linkage in the gfp fingerpint set -gfp_spread_buckets_v2 - Calculates the distance spread of fingerprints against target fingerprint or group of fingerprints while considering a bucketized variable like activity or CLOGP -gfp_nearneighbours_single_file - Finds near neighbours within a set of fingerprints -gfp_nearneighbours - Finds near neighbours of a set of fingerprints -gfp_leader_v2 - Performs clustering with leader (sphere exclusion) algorithm on gfp descriptors -gfp_distance_matrix - Computes the distance matrix for a pool of gfp fingerprints; generates a human-readable ascii matrix -descriptor_file_to_01_fingerprints - Converts a integer descriptor file to fingerprints, either fixed 0/1 or non colliding counted -nplotnn - Processes the output of several gfp nearneighbour tools into SMILES -tdt_sort - Sorts fields of a TDT file or stream according to specific tag, properties, or the degree of each node -tdt_join - Joins two TDT streams, possible with different identifiers -descriptors_to_fingerprint - Converts a descriptors to a sparse fingerprint - -Retired scripts -=============== - -Bug fixes -========= -Many - -Data -========= - -Lib -========= - - -Updates -======= -Many - -Known issues -============ -The output precision and format for the float point numbers might be different -on mac and linux os -The generated fingerprints can not be shared across OS's - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -2019-01 Release 2.1 - -New scripts -=========== - -Retired scripts -=============== - - -Bug fixes -========= - - -Data -========= - - -Lib -========= - - -Updates -======= -rxn_substructure_search - Reorganize and rationalize the interface of the scripts - - Add some missing functionality for example reaction smiles search -rxn_standardize - Reorganize and rationalize the interface of the scripts - - Add component cleaning option - -Known issues -============ - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -2018-10 Release 2.0 - -New scripts -=========== -random_smiles - Generate random smiles based on input smiles -preferred_smiles - Write either unique smiles (if interpretable) or non aromatic unique form -rotatable_bonds - Calculate the rotatable bonds in the modules -concat_files - Concatenates descriptor files by joining on identifiers -msort - Sorts a molecule file by various criteria -tp_first_pass - Runs molecules through the Lilly medchem rules, skip to next molecule upon crossing a threshold or instant kill rule -mol2qry - Converts a molecule to a query file -molecular_scaffold - Chemical structure fragmentation tool to recursively cuts molecules into fragments -molecule_subset - Extracts a subset of atoms from set of molecules based on a single substructure -rgroup - Identifies substituents from substructure matched molecule -ring_extraction - Extracts rings from molecules -ring_trimming - Exhaustively trim rings from ring systems, preserving aromaticiy -sp3_filter - Filter molecules according to sp3 content -tautomer_generation - Enumerate tautomeric forms for molecules -smiles_mutation - Generate new smiles from a set of input molecules by random strong operations -rxn_substructure_search - Search substructure over reactions -activity_consistency - Group identical molecules (including isomers) with varying activity values - -Retired scripts -=============== - - - -Bug fixes -========= - - -Data -========= - - -Lib -========= - - -Updates -======= - -Known issues -============ - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -2018-06 Release 1.0 - -New scripts -=========== -common_names - Merge identical chemical structures to one common name in a SMILES file (also see unique_molecules tool). Useful for identifying unique chemical structures in a SMILES file. -fetch_smiles_quick - Fetches records from one file based on identifiers in another file -unique_molecules - Filters out duplicate chemical structures based on unique smiles -unique_rows - Identifies the unique rows in a file -iwcut - Extract columns from a text file -fileconv - Structure file utility to clean up SMILES files and filter on specific criteria. It can also be used to convert between chemical file formats including, e.g from SDF to SMILES -rxn_signature - Generates reaction signatures for input reactions -rxn_standardize - Checks and standardizes input chemical reactions; converts to a reaction smiles file format -tsubstructure - Perform 2D substructure searches with SMILES/SMARTS against SMILES files -retrosynthesis - Defines synthetic routes for input chemical structures by deconstructing input molecules into reactants using a set of known reactions templates. Conceptually, the inverse process of chemical reaction synthesis as implemented by tool trxn -trxn - Performs reactions between reactant molecules to enumerate product structures. Uses a control reaction file, a scaffold SMILES file and zero or more reactant SMILES files. Conceptually inverse of retrosynthesis process as implemented by tool retrosynthesis -iwdemerit - Computes demerit of a molecule. In this context demerits refers to non-desirable molecular structure characteristics/features - -Retired scripts -=============== - - - -Bug fixes -========= - - -Data -========= - - -Lib -========= -libaccumulator.a -libiwbits.a -libiwmolecule.a -libiwstring.a -libiwtemplate.a -libcmdline.a -libiwcrex.a -libiwnormalisation.a -libiwstring_data_source.a -libsparsefp.a -libcmdline_v2.a -libiwhistogram.a -libiwqsort.a -libiwstring_string_data_source.a -libxmlParser.a -libiwaray.a -libiwmisc.a -libiwrandom.a -libiwtdt.a - - -Updates -======= - -Known issues -============ - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/contrib/README b/contrib/README deleted file mode 100644 index e8bf212a..00000000 --- a/contrib/README +++ /dev/null @@ -1,22 +0,0 @@ -Warning: Any tool under this folder is not guaranteed, documented or supported. - Please use them with extreme caution. - -REQUIREMENT: - - -BUILD: - - -EXECUTION: - - -DIRECTORY: -script: scripts for ruby, shell etc. -data: persistency data - - -TEST: - -LICENSE: -Consult the LICENSE file for details of the license - diff --git a/contrib/README.md b/contrib/README.md new file mode 100644 index 00000000..3f83f48f --- /dev/null +++ b/contrib/README.md @@ -0,0 +1,8 @@ +# Contrib +The contrib directory contains data and scripts that have proven to be +useful with LillyMol. + +Most newly added data files are in the top level data directory. + +Shell wrappers, perl, python and ruby scripts are in `contrib/bin`, +but may migrate to `bin` in subsequent releases. diff --git a/contrib/script/sh/abr.sh b/contrib/bin/abr.sh similarity index 55% rename from contrib/script/sh/abr.sh rename to contrib/bin/abr.sh index 5fb84dc8..45ed22c8 100755 --- a/contrib/script/sh/abr.sh +++ b/contrib/bin/abr.sh @@ -2,12 +2,18 @@ # set up queries for abraham queries. -if [ ! -v LILLYMOL_HOME ] ; then - echo "Must set shell variable LILLYMOL_HOME" >&2 - exit 1 +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) fi ABR_LIB=${LILLYMOL_HOME}/data/abraham +if [[ ! -d ${ABR_LIB} ]] ; then + echo "$0 where are my queries ${ABR_LIB}" >&2 + exit 1 +fi + F=${ABR_LIB}/Abraham P=${ABR_LIB}/Alpha2H diff --git a/contrib/bin/ap.sh b/contrib/bin/ap.sh new file mode 100755 index 00000000..c276dcab --- /dev/null +++ b/contrib/bin/ap.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# set up queries for Abraham Platts queries. + +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) +fi +echo "LILLYMOL_HOME in ${LILLYMOL_HOME}" + +CONSTANTS=${LILLYMOL_HOME}/data/abraham_hbond_constants +ls ${CONSTANTS} + +exec ${LILLYMOL_HOME}/bin/Linux/substituent_model -E autocreate -l \ + -q S:${CONSTANTS} -u -M ap_sa= -M ap_sb= "$@" diff --git a/contrib/bin/assign_donor_acceptor.sh b/contrib/bin/assign_donor_acceptor.sh new file mode 100755 index 00000000..9761aa7b --- /dev/null +++ b/contrib/bin/assign_donor_acceptor.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) +fi + +charges="${LILLYMOL_HOME}/data/queries/charges/queries" +hbonds="${LILLYMOL_HOME}/data/queries/hbonds" + +exe="${LILLYMOL_HOME}/bin/$(uname)/fileconv" +exec ${exe} -i mdlD -i mdlT -g all -E autocreate -i ICTE -N F:${charges} \ + -H a=F:${hbonds}/acceptor -H d=${hbonds}/donor.qry -H label -S - "$@" diff --git a/contrib/bin/assign_formal_charges.sh b/contrib/bin/assign_formal_charges.sh new file mode 100755 index 00000000..8e45565f --- /dev/null +++ b/contrib/bin/assign_formal_charges.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) +fi + +charges="${LILLYMOL_HOME}/data/queries/charges/queries" + +exe="${LILLYMOL_HOME}/bin/$(uname)/fileconv" +exec ${exe} -i mdlD -i mdlT -g all -E autocreate -i ICTE -N F:${charges} -S - "$@" diff --git a/contrib/script/ruby/confusion_matrix.rb b/contrib/bin/confusion_matrix.rb similarity index 100% rename from contrib/script/ruby/confusion_matrix.rb rename to contrib/bin/confusion_matrix.rb diff --git a/contrib/script/py/dicer_fragments_collate.py b/contrib/bin/dicer_fragments_collate.py similarity index 100% rename from contrib/script/py/dicer_fragments_collate.py rename to contrib/bin/dicer_fragments_collate.py diff --git a/contrib/script/ruby/dopattern.rb b/contrib/bin/dopattern.rb similarity index 100% rename from contrib/script/ruby/dopattern.rb rename to contrib/bin/dopattern.rb diff --git a/contrib/script/sh/dopattern.sh b/contrib/bin/dopattern.sh similarity index 100% rename from contrib/script/sh/dopattern.sh rename to contrib/bin/dopattern.sh diff --git a/contrib/script/ruby/fragment_filter.rb b/contrib/bin/fragment_filter.rb similarity index 99% rename from contrib/script/ruby/fragment_filter.rb rename to contrib/bin/fragment_filter.rb index dc8df01b..26066537 100755 --- a/contrib/script/ruby/fragment_filter.rb +++ b/contrib/bin/fragment_filter.rb @@ -248,7 +248,7 @@ def execute_system(cmd, must_be_present = false) # Now substructure filters -cmd = "#{ianhome}/bin/ZOF.v2.sh" +cmd = "#{ianhome}/bin/zof.sh" if (cl.option_present('ZOF')) tmp = cl.value('ZOF') cmd = "#{tmp}" diff --git a/contrib/script/sh/gfp_erg.sh b/contrib/bin/gfp_erg.sh similarity index 64% rename from contrib/script/sh/gfp_erg.sh rename to contrib/bin/gfp_erg.sh index 446e6579..1b9807a6 100755 --- a/contrib/script/sh/gfp_erg.sh +++ b/contrib/bin/gfp_erg.sh @@ -1,9 +1,10 @@ #!/bin/bash # Set up queries for gfp_erg -if [ ! -v LILLYMOL_HOME ] ; then - echo "Must set shell variable LILLYMOL_HOME" >&2 - exit 1 +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) fi ERG_QUERIES=${LILLYMOL_HOME}/data/ErG @@ -24,4 +25,5 @@ DIST="-d 10" ABSTRACT="-m" MAX_FF="-X 20" -exec ${LILLYMOL_HOME}/bin/Linux/gfp_erg -n ${AROMATICITY} ${CHARGES} ${ACCEPTOR} ${DONOR} ${LABEL} ${ENDCAPS} ${FUZZY} "$@" +exe=${LILLYMOL_HOME}/bin/$(uname)/gfp_erg +exec ${exe} -n ${AROMATICITY} ${CHARGES} ${ACCEPTOR} ${DONOR} ${LABEL} ${ENDCAPS} ${FUZZY} "$@" diff --git a/contrib/script/perl/gfp_make.pl b/contrib/bin/gfp_make.pl similarity index 100% rename from contrib/script/perl/gfp_make.pl rename to contrib/bin/gfp_make.pl diff --git a/contrib/script/sh/ghose_crippen.sh b/contrib/bin/ghose_crippen.sh similarity index 51% rename from contrib/script/sh/ghose_crippen.sh rename to contrib/bin/ghose_crippen.sh index fd115853..e4778de6 100755 --- a/contrib/script/sh/ghose_crippen.sh +++ b/contrib/bin/ghose_crippen.sh @@ -5,13 +5,15 @@ # this, perhaps the program will be useful for some # other additive contribution model. -if [ ! -v LILLYMOL_HOME ] ; then - echo "Must set shell variable LILLYMOL_HOME" >&2 - exit 1 +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) fi set -x QUERIES=${LILLYMOL_HOME}/data/wildman_crippen.dat -CHARGES=${LILLYMOL_HOME}/contrib/data/queries/charges/queries +CHARGES=${LILLYMOL_HOME}/data/queries/charges/queries -exec ${LILLYMOL_HOME}/bin/Linux/ghose_crippen -F ${QUERIES} -N F:${CHARGES} "$@" +exe=${LILLYMOL_HOME}/bin/$(uname)/ghose_crippen +exec ${exe} -F ${QUERIES} -N F:${CHARGES} "$@" diff --git a/contrib/bin/graph_edit_changes.sh b/contrib/bin/graph_edit_changes.sh index 1ef9d6bb..2b6a3e40 100755 --- a/contrib/bin/graph_edit_changes.sh +++ b/contrib/bin/graph_edit_changes.sh @@ -5,9 +5,13 @@ # TODO: random_molecular_transformations emits too many warning # messages, code needs cleanup.. -lillymol_home=$(dirname $(dirname $0)) +if [[ -v LILLYMOL_HOME ]] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) +fi -lib="${lillymol_home}/data/random_molecular_transformations.d" +lib="${LILLYMOL_HOME}/data/random_molecular_permutations.d" if [[ ! -d ${lib} ]] ; then echo "Missing data ${lib}" >&2 ls ${lib} @@ -44,4 +48,5 @@ probabilities="${lib}/graph_edit_changes" fi done -exec random_molecular_permutations -L single=$single -L double=$double -L arom=$aromatic -L aromR=$aromatic_ring -L fsarom=$fuse_aromatic_ring -L aliphR=${aliphatic_ring} -L singleR=$single_any -L singleR=${single2} -L singleR=${single3} -r $r -R $R -P $probabilities "$@" +exe=${LILLYMOL_HOME}/bin/$(uname)/random_molecular_permutations +exec ${exe} -L single=$single -L double=$double -L arom=$aromatic -L aromR=$aromatic_ring -L fsarom=$fuse_aromatic_ring -L aliphR=${aliphatic_ring} -L singleR=$single_any -L singleR=${single2} -L singleR=${single3} -r $r -R $R -P $probabilities "$@" diff --git a/contrib/bin/iwdescr.sh b/contrib/bin/iwdescr.sh new file mode 100755 index 00000000..43a6f407 --- /dev/null +++ b/contrib/bin/iwdescr.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) +fi + +charges="${LILLYMOL_HOME}/data/queries/charges/queries" +hbonds="${LILLYMOL_HOME}/data/queries/hbonds" +ranges=${LILLYMOL_HOME}/data/chembl.ranges + +exec ${LILLYMOL_HOME}/bin/Linux/iwdescr -N F:${charges} \ + -H a=F:${hbonds}/acceptor -H d=${hbonds}/donor.qry -H label \ + -B ranges=${ranges} \ + -l -g all -u 0 -b 5 -O all -B quiet -E autocreate "$@" + diff --git a/contrib/script/ruby/iwqb.rb b/contrib/bin/iwqb.rb similarity index 97% rename from contrib/script/ruby/iwqb.rb rename to contrib/bin/iwqb.rb index 2645b327..0745fd0a 100755 --- a/contrib/script/ruby/iwqb.rb +++ b/contrib/bin/iwqb.rb @@ -4,7 +4,7 @@ lillymol_home = ".." -require "#{lillymol_home}/ruby/lib/iwcmdline.rb" +require_relative "lib/iwcmdline.rb" stem = "iwqb#{Process.pid}" @@ -79,7 +79,7 @@ def usage (rc) m.print "hostname >&2\n" m.print "uname=`uname`\n" m.print "export LILLYMOL_HOME=#{lillymol_home}\n" -m.print "export PATH=$PATH:$LILLYMOL_HOME/bin/sh\n" +m.print "export PATH=$PATH:$LILLYMOL_HOME/bin\n" m.print "\n" diff --git a/contrib/bin/jwcats.sh b/contrib/bin/jwcats.sh new file mode 100755 index 00000000..3ba1f280 --- /dev/null +++ b/contrib/bin/jwcats.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# Setup queries for jwcats + +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) +fi + +charges="${LILLYMOL_HOME}/data/queries/charges/queries" +hbonds="${LILLYMOL_HOME}/data/queries/hbonds" + +exe=${LILLYMOL_HOME}/bin/$(uname)/jwcats +exec ${exe} -N noremove -N F:${charges} -H noremove -H a=F:${hbonds}/acceptor -H d=${hbonds}/donor.qry -H label "$@" + diff --git a/contrib/script/sh/jwdist.sh b/contrib/bin/jwdist.sh similarity index 67% rename from contrib/script/sh/jwdist.sh rename to contrib/bin/jwdist.sh index 4ca078c6..186ac2f7 100755 --- a/contrib/script/sh/jwdist.sh +++ b/contrib/bin/jwdist.sh @@ -2,13 +2,14 @@ # Setup queries for jwcats -if [ ! -v LILLYMOL_HOME ] ; then - echo "Must set shell variable LILLYMOL_HOME" >&2 - exit 1 +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) fi -charges="${LILLYMOL_HOME}/contrib/data/queries/charges/" -hbonds="${LILLYMOL_HOME}/contrib/data/queries/hbonds" +charges="${LILLYMOL_HOME}/data/queries/charges/" +hbonds="${LILLYMOL_HOME}/data/queries/hbonds" exec ${LILLYMOL_HOME}/bin/Linux/jwdist \ -N athpos -N F:${charges}/queries \ diff --git a/contrib/bin/medchem_wizard.sh b/contrib/bin/medchem_wizard.sh new file mode 100755 index 00000000..a0a2bc2a --- /dev/null +++ b/contrib/bin/medchem_wizard.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) +fi + +rxn_dir=${LILLYMOL_HOME}/data/MedchemWizard + +if [[ ! -d "${rxn_dir}" ]] ; then + echo "$0 where are my reactions ${rxn_dir}" >&2 + exit 1 +fi + +exe=${LILLYMOL_HOME}/bin/$(uname)/medchemwizard + +exec ${exe} -R "${rxn_dir}/REACTIONS" $@ diff --git a/contrib/script/py/mkbenzene.py b/contrib/bin/mkbenzene.py similarity index 100% rename from contrib/script/py/mkbenzene.py rename to contrib/bin/mkbenzene.py diff --git a/contrib/script/sh/pubchem_fingerprints.sh b/contrib/bin/pubchem_fingerprints.sh similarity index 51% rename from contrib/script/sh/pubchem_fingerprints.sh rename to contrib/bin/pubchem_fingerprints.sh index 5c2571d3..13bab858 100755 --- a/contrib/script/sh/pubchem_fingerprints.sh +++ b/contrib/bin/pubchem_fingerprints.sh @@ -1,13 +1,19 @@ #!/bin/bash +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) +fi + # The directory in which the queries are found -dir=$(dirname ${0%%.sh}) -program="${dir}/../../../bin/Linux/pubchem_fingerprints" -query_dir="${dir}/../../data/pubchem_fingerprints" +query_dir="${LILLYMOL_HOME}/data/pubchem_fingerprints" + options="-q section4=${query_dir}//section4.smt "` `"-q section5=${query_dir}/section5.smt "` `"-q section6=${query_dir}/section6.smt "` `"-q section7=${query_dir}/section7.smt" - exec ${program} ${options} "$@" +exe=${LILLYMOL_HOME}/bin/$(uname)/pubchem_fingerprints +exec ${exe} ${options} "$@" diff --git a/contrib/bin/random_molecular_permutations.sh b/contrib/bin/random_molecular_permutations.sh new file mode 100755 index 00000000..082d4f0d --- /dev/null +++ b/contrib/bin/random_molecular_permutations.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +if [[ -v LILLYMOL_HOME ]] ; then + true +else + here=$(dirname $0) + up=$(dirname ${here}) + up=$(dirname ${up}) + export LILLYMOL_HOME=${up} + echo "LILLYMOL_HOME at ${LILLYMOL_HOME}" +fi + +lib="${LILLYMOL_HOME}/data/random_molecular_permutations.d" +if [[ ! -d ${lib} ]] ; then + echo "Missing data ${lib}" >&2 + ls ${lib} + exit 1 +fi + +# Define transformation libraries +single="${lib}/single_attachment_fragments.smi"; +single_any="${lib}/single_attachment_fragments_any_atom.smi" +double="${lib}/double_attachment_fragments.smi"; +aromatic="${lib}/aromatic_attachment_fragments.smi"; +aromatic_ring="${lib}/aromatic_ring.smi" +fuse_aromatic_ring="${lib}/fuse_aromatic_ring.smi" +aliphatic_ring="${lib}/aliphatic_ring.smi" + +single2="${lib}/Fragments.rings_aliphatic.smi" +single3="${lib}/Fragments.rings_aromatic.smi" + +probabilities="${lib}/random_molecular_transformations" + +# default min and max ring size, can be overwritten +# in the command r and/or R will get repeated, but that does not matter + r=4 + R=7 + for ((i=1; i<$#; i++)); do + if [[ "${!i}" == "-r" ]]; then + j=$((i+1)) + r="${!j}" + elif [[ "${!i}" == "-R" ]]; then + j=$((i+1)) + R="${!j}" + fi + done + +exe=${LILLYMOL_HOME}/bin/$(uname)/random_molecular_permutations +exec ${exe} -L single=$single -L double=$double -L arom=$aromatic -L aromR=$aromatic_ring -L fsarom=$fuse_aromatic_ring -L aliphR=${aliphatic_ring} -L singleR=$single_any -L singleR=${single2} -L singleR=${single3} -r $r -R $R -P $probabilities "$@" diff --git a/contrib/script/py/rdkitfp2gfp.py b/contrib/bin/rdkitfp2gfp.py similarity index 100% rename from contrib/script/py/rdkitfp2gfp.py rename to contrib/bin/rdkitfp2gfp.py diff --git a/contrib/bin/reduced_graph.sh b/contrib/bin/reduced_graph.sh index fd84dabe..7e00e56f 100755 --- a/contrib/bin/reduced_graph.sh +++ b/contrib/bin/reduced_graph.sh @@ -1,19 +1,19 @@ #!/bin/bash -if [[ ! -v LILLYMOL_HOME ]] -then - echo 'Must set shell variable LILLYMOL_HOME' >&2 - exit 1 +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) fi -charges="${LILLYMOL_HOME}/contrib/data/queries/charges/queries" -hbonds="${LILLYMOL_HOME}/contrib/data/queries/hbonds" -# File containing reduced_graph::GraphReduction testprotos describing +charges="${LILLYMOL_HOME}/data/queries/charges/queries" +hbonds="${LILLYMOL_HOME}/data/queries/hbonds" +# File containing reduced_graph::GraphReduction textprotos describing # a series of reductions. -reductions=${LILLYMOL_HOME}/contrib/data/reduced_graph/reductions +reductions=${LILLYMOL_HOME}/data/reduced_graph/reductions # If you want to use reductions based on LillyMol donor acceptor assignments, use -# reductions=${LILLYMOL_HOME}/contrib/data/reduced_graph/reductions.donor_acceptor +# reductions=${LILLYMOL_HOME}/data/reduced_graph/reductions.donor_acceptor # Those queries use the isotopic labels applied by the donor acceptor. exec ${LILLYMOL_HOME}/bin/Linux/reduced_graph -N F:${charges} \ diff --git a/contrib/script/py/smiles2png.py b/contrib/bin/smiles2png.py similarity index 100% rename from contrib/script/py/smiles2png.py rename to contrib/bin/smiles2png.py diff --git a/contrib/script/ruby/svmfp_summarise_results.rb b/contrib/bin/svmfp_summarise_results.rb similarity index 100% rename from contrib/script/ruby/svmfp_summarise_results.rb rename to contrib/bin/svmfp_summarise_results.rb diff --git a/contrib/script/ruby/vf_main.rb b/contrib/bin/vf_main.rb similarity index 100% rename from contrib/script/ruby/vf_main.rb rename to contrib/bin/vf_main.rb diff --git a/contrib/script/ruby/vf_record_selector.rb b/contrib/bin/vf_record_selector.rb similarity index 100% rename from contrib/script/ruby/vf_record_selector.rb rename to contrib/bin/vf_record_selector.rb diff --git a/contrib/script/sh/zof.sh b/contrib/bin/zof.sh similarity index 89% rename from contrib/script/sh/zof.sh rename to contrib/bin/zof.sh index 3d1c00b1..803be142 100755 --- a/contrib/script/sh/zof.sh +++ b/contrib/bin/zof.sh @@ -2,19 +2,13 @@ # Implement fragment filtering rules. Collaboration with Teddy Zartler -if [[ ! -v LILLYMOL_HOME ]] ; then - x=$(dirname $0) - x=$(readlink -e ${x}) - LILLYMOL_HOME=${x%%/contrib/script/sh} - echo "\$LILLYMOL_HOME not set, using default ${LILLYMOL_HOME}" >&2 +if [ -v LILLYMOL_HOME ] ; then + true +else + export LILLYMOL_HOME=$(dirname $(dirname $(dirname $0))) fi -if [[ ! -v BUILD_DIR ]] ; then - echo "\$BUILD_DIR not set, assuming Linux" >&2 - BUILD_DIR='Linux' -fi - -ZARTLER=${LILLYMOL_HOME}/contrib/data/queries/zof +ZARTLER=${LILLYMOL_HOME}/data/queries/zof if [[ ! -d ${ZARTLER} ]] ; then echo "Query directory ${ZARTLER} not found" >&2 exit 1 @@ -25,7 +19,7 @@ if [ -z "$@" ]; then exit 1 fi -tsubstructure= 'tsubstructure.sh' +tsubstructure="${LILLYMOL_HOME}/bin/$(uname)/tsubstructure" # A series of substructure queries that eliminate molecules that are # less desirable as fragments. diff --git a/contrib/data/AtomicPhysChemParameter/wildman_crippen.dat b/contrib/data/AtomicPhysChemParameter/wildman_crippen.dat deleted file mode 100755 index a551ad35..00000000 --- a/contrib/data/AtomicPhysChemParameter/wildman_crippen.dat +++ /dev/null @@ -1,262 +0,0 @@ -# Parameters from Wildman & Crippen, JCICS 1999, 39, 868-873 - -# Speical stuff for zwitterions -[OH]-[CD3](=O).[NH2T0]-[CG0] -2.5 ISO=188 CONF=40 NOMARK -[OH]-[CD3](=O).[NHT0](-[CG0])-[CG0] -2.5 ISO=188 CONF=40 NOMARK - -# from the paper - -[CH4] 0.1441 ISO=1 -[CH3]-C 0.1441 ISO=1 -[CH2](-C)-C 0.1441 ISO=1 - -[CH1D4T0](-C)(-C)(-C) 0.000 ISO=2 -[CH0D4T0](-C)(-C)(-C)-C 0.000 ISO=2 - -[CH2X4]-a -0.0516 ISO=10 -[CHX4]-a 0.1193 ISO=11 -[CH0X4]-a -0.0967 ISO=12 - -[CH3]-[N,O,P,S,F,Cl,Br,I] -0.2035 ISO=3 -[CH2X4]-[N,O,P,S,F,Cl,Br,I] -0.2035 ISO=3 - -[CH1X4]-[N,O,P,S,F,Cl,Br,I] -0.2051 ISO=4 -[CH0X4]-[N,O,P,S,F,Cl,Br,I] -0.2051 ISO=4 - -C=[!#6;!#1] -0.2783 ISO=5 - -[CH2]=C 0.1551 ISO=6 -[CH1D3]=C 0.1551 ISO=6 -[CH0D3]=C 0.1551 ISO=6 -[CD2](=C)=C 0.1551 ISO=6 - -[CX2]#* 0.00170 ISO=7 - -[CH3]-c 0.08452 ISO=8 - -[CH3]-[!#6;!#1;a] -0.1444 ISO=9 - -[cH0]-[#5] -0.5443 ISO=13 Boron -[cH0]-[#14] -0.5443 ISO=13 Silicon -[cH0]-[#15] -0.5443 ISO=13 Phosphorus -[cH0]-[#33] -0.5443 ISO=13 Arsenic -[cH0]-[#34] -0.5443 ISO=13 Selenium -# Tin too rare [cH0]-[#50] -0.5443 ISO=13 -# mercury too rare [cH0]-[#80] -0.5443 ISO=13 - -c-F 0.0000 ISO=14 -c-Cl 0.2450 ISO=15 -c-Br 0.1980 ISO=16 -c-I 0.0000 ISO=17 - -[cH] 0.1581 ISO=18 - -[cD3](:a)(:a):a 0.2955 ISO=19 - -c(:a)(:a)-a 0.2713 ISO=20 -c(:a)(:a)-C 0.1360 ISO=21 -c(:a)(:a)-N 0.4619 ISO=22 -c(:a)(:a)-O 0.5437 ISO=23 -c(:a)(:a)-S 0.1893 ISO=24 - -c(:a)(:a)=C -0.8186 ISO=25 -c(:a)(:a)=N -0.8186 ISO=25 -c(:a)(:a)=O -0.8186 ISO=25 - -# Sulphur was not in the original paper, but logpstar has plenty of examples - -c(:a)(:a)=S -0.60 ISO=25 - -C(=C)(a)[!#1] 0.2640 ISO=26 -C(=C)(c)a 0.2640 ISO=26 -[CH](=C)a 0.2640 ISO=26 -C=c 0.2460 ISO=26 - -[CX4]-[!#6;!#7;!#8;!#15;!#16;!#9;!#17;!#35;!#53;!#1] 0.2148 ISO=27 - -[#6] 0.08129 ISO=28 - -# Hydrocarbons - -[#1]-[#6] 0.1230 ISO=29 -[#1]-[#1] 0.1230 ISO=29 - -[#1]-O-[CX4] -0.2677 ISO=30 -[#1]-O-c -0.2677 ISO=30 -[#1]-O-[#1,#5,#15,#33,#50] -0.2677 ISO=30 -[#1][#5,#14,#15,#16,#50] -0.2677 ISO=30 - -[#1]-[#7] 0.2142 ISO=31 -[#1]-O-[#7] 0.2142 ISO=31 - -[#1]-O-C=[#6] 0.2980 ISO=32 -[#1]-O-C=[#7] 0.2980 ISO=32 -[#1]-O-C=O 0.2980 ISO=32 -[#1]-O-C=S 0.2980 ISO=32 -[#1]-O-O 0.2980 ISO=32 -[#1]-O-S 0.2980 ISO=32 - -[#1] 0.1125 ISO=33 - -[NH2+0]-[A;!#1] -1.0190 ISO=34 - -[NH1+0](-[!#1])-[!#1] -0.7096 ISO=35 -[NH2+0]-a -1.0270 ISO=36 -[NH+0](-[!#1])-a -0.5188 ISO=37 -[NH+0](-a)-a -0.5188 ISO=37 - -[NH+0]=A 0.08387 ISO=38 -[NH+0]=a 0.08387 ISO=38 - -# Nitrate groups were problematic - -[ND3](=O)(=O)-[OD2H0] 0.7 ISO=88 - -# nitro group - -[ND3](=O)(=O)-c -0.41 ISO=89 - -[ND3](=O)=O -0.49 ISO=77 - -[N+0](=A)-[!#1] 0.1836 ISO=39 -[N+0](=A)-a 0.1836 ISO=39 -[N+0](=a)-[!#1] 0.1836 ISO=39 -[N+0](=a)-a 0.1836 ISO=39 - -[N+0](-[!#1;A])(-[!#1;A])-[!#1;A] -0.3187 ISO=40 - -[N+0](-a)(-[!#1])-[!#1] -0.4458 ISO=41 -[N+0](-a)(-a)-[!#1] -0.4458 ISO=41 -[N+0](-a)(-a)-a -0.4458 ISO=41 - -[N+0]#C-a -0.10 ISO=79 -[N+0]#C-[CH2] -0.58 ISO=80 -[N+0]#C-[CG1] 0.55 ISO=81 -[N+0]#C-N -0.27 ISO=82 - -# Once I subdivided the types of cyano, I changed the default value - -[N+0]#A -0.09 ISO=42 - -[NH3+] -1.950 ISO=43 -[NH2+] -1.950 ISO=43 -[NH+] -1.950 ISO=43 - -[n+0H]:c=O -0.21 ISO=86 -[nH0+0] -0.31 ISO=98 -[n+0] -0.3245 ISO=44 - -[n+] -1.119 ISO=45 - -[NH+0D4] -0.3396 ISO=46 -[NH+0](=A)(-[!#1])-[!#1] -0.3396 ISO=46 -[NH+0](=A)(-[!#1])-a -0.3396 ISO=46 -[NH+0](=[#6])=[#7] -0.3396 ISO=46 - -[N+]#A 0.2887 ISO=47 -[N-] 0.2887 ISO=47 -[N+](=[N-])=N 0.2887 ISO=47 - -[#7] -0.4806 ISO=48 - -[o] 0.1552 ISO=49 -[OH] -0.2893 ISO=50 - -[OD2H0](-C=O)-A 0.05 ISO=87 - -O(-C)-C -0.14 ISO=51 -O(-[!#6;!#1])-C -0.14 ISO=51 -O(-[!#6;!#1])-[!#6;!#1] -0.14 ISO=51 - -O(-[!#1])-a -0.4195 ISO=52 -O(-a)-a -0.4195 ISO=52 - -O=[#8] 0.0335 ISO=53 - -# Noticed that many O=N=C were too high - -O=N=C -1.1 ISO=74 - -# Was getting the default oxygen for O=S=O - -O=[S,P] -0.5 ISO=76 - -# These weren't very good - -O=n -0.5 ISO=75 CONF=40 - -O=[#7] 0.0335 ISO=53 -[OX1-]=[#7] 0.0335 ISO=53 - -[OX1-]-[#16] -0.3339 ISO=54 -[OX1-]-[!#7;!#16] -1.189 ISO=55 - -O=c 0.1788 ISO=56 - -O=[CH]-C -0.1526 ISO=57 -O=C(-C)-C -0.1526 ISO=57 -O=C(-C)-[!#6;!#1] -0.1526 ISO=57 -O=[CH]-N -0.1526 ISO=57 -O=[CH]-O -0.1526 ISO=57 -O=[CH2] -0.1526 ISO=57 -O=[CX2]=O -0.1526 ISO=57 - -O=[CH]-c 0.1129 ISO=58 -O=C(-C)-c 0.1129 ISO=58 -O=C(-c)-c 0.1129 ISO=58 -O=C(-c)-[a;!#6;!#1] 0.1129 ISO=58 -O=C(-c)-[A;!#6;!#1] 0.1129 ISO=58 -O=C(-C)-[a;!#6;!#1] 0.1129 ISO=58 - -O=C(-[A;!#6;!#1])-[A;!#6;!#1] 0.4833 ISO=59 -O=C(-[A;!#6;!#1])-[a;!#6;!#1] 0.4833 ISO=59 -O=C(-[a;!#6;!#1])-[a;!#6;!#1] 0.4833 ISO=59 - -# Since we've done chemical standardisation, we don't match the acid - -[O-]-C=O -1.326 ISO=60 - -[#8] -0.1188 ISO=61 - -[#9+0] 0.4202 ISO=62 -[#17+0] 0.6895 ISO=63 -[#35+0] 0.8456 ISO=64 -[#53+0] 0.8857 ISO=65 - -[#9-] -2.996 ISO=66 -[#17-] -2.996 ISO=66 -[#17+] -2.996 ISO=66 no idea -[#35-] -2.996 ISO=66 -[#35+] -2.996 ISO=66 no idea -[#53-] -2.996 ISO=66 -[#53+] -2.996 ISO=66 - -[#15] 0.8612 ISO=67 - -# I found that SO3- groups were all wrong - -[SD4](-[OH])(=O)=O -1.30 ISO=73 CONF=40 - -# And S=C wasn't too good either - -[SD3G1]=O -0.55 ISO=78 - -[SD2H0](-[!#6]) 0.13 ISO=83 -[SD2H0]-a 0.80 ISO=84 - -[SG2]-a 0.33 ISO=85 - -S-a 0.45 ISO=90 - -[S+0] 0.67 ISO=68 -[S-] -0.0024 ISO=69 -[S+] -0.0024 ISO=69 -[s] 0.6237 ISO=70 - -[B] -0.3808 ISO=71 -[Si] -0.3808 ISO=71 -[As] -0.3808 ISO=71 -[Se] -0.3808 ISO=71 - -[Cd] -0.0025 ISO=72 -[In] -0.0025 ISO=72 diff --git a/contrib/data/DEL/AnnotationQueries/data b/contrib/data/DEL/AnnotationQueries/data deleted file mode 100644 index 5c8d116ab9862f0f1d701cd0a32c0e4dbede5874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305098 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≺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

-qUSC;oSxD=Ae@Z0j-BLcs>j@Zr?E$bgvW`Rw_ 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

&r7*({NGO1UqRXCB~1Zczv3!D7@?yO8d@D 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 diff --git a/contrib/script/README b/contrib/script/README deleted file mode 100644 index 3139aa93..00000000 --- a/contrib/script/README +++ /dev/null @@ -1,25 +0,0 @@ -Warning: Any tool under this folder is not guaranteed, documented or supported. - Please use them with extreme caution. - -REQUIREMENT: - - -BUILD: - - -EXECUTION: -Example to run the command: - cd contrib/sh/ - ./dopattern.sh - - -DIRECTORY: -ruby: ruby library -sh: shell scripts - - -TEST: - -LICENSE: -Consult the LICENSE file for details of the license - diff --git a/contrib/script/py/pybase/pyopmo.py b/contrib/script/py/pybase/pyopmo.py index 4a3c1abf..87c5fe05 100755 --- a/contrib/script/py/pybase/pyopmo.py +++ b/contrib/script/py/pybase/pyopmo.py @@ -54,8 +54,8 @@ 'alogp': [root_dir + '/abraham', '', {'-l': '', - '-F': home_dir + '/contrib/data/queries/abraham/Abraham', - '-P': home_dir + '/contrib/data/queries/abraham/Alpha2H', + '-F': home_dir + '/data/queries/abraham/Abraham', + '-P': home_dir + '/data/queries/abraham/Alpha2H', '-g': 'all' }] } diff --git a/contrib/script/ruby/lib/iwcmdline.rb b/contrib/script/ruby/lib/iwcmdline.rb deleted file mode 100755 index 0e449ce6..00000000 --- a/contrib/script/ruby/lib/iwcmdline.rb +++ /dev/null @@ -1,291 +0,0 @@ -# Mimic many of the functions of the C++ cmdline object -# $Id$ -class IWCmdline - def initialize (opts) - @_count = Hash.new{0} # count of how many times each argument encountered - - opts.freeze - - if 0 == opts.length - return - end - - @_unrecognised_options = Array.new - - okargs = Hash.new - - opts.split('-').each { |opt| - next unless opt.length > 0 - - opt.gsub!(/ /, "") # spaces cannot be part of this - - if opt =~ /\S+=\S+/ # of the form option=requirement - a = opt.split('=') - okargs[a[0]] = a[1] - else - okargs[opt] = "" - end - } - -# okargs.each { |key, value| -# $stderr.print "Qualifiers for option '#{key}' '#{value}'\n" -# } - - starts_with_dash = Regexp.new("^-+") - - @_option_value = Hash.new - - iptr = 0 - while (iptr < ARGV.size) - opt = "#{ARGV[iptr]}" - -# important design decision: should it stop grabbing arguments once -# it encounters a non-option? - - unless starts_with_dash.match(opt) - iptr += 1 - break -# next - end - - if ("-" == opt && iptr == ARGV.size - 1) - break - end - - opt.gsub!(/^-+/, "") - -# $stderr.print "Examining argument '#{opt}'\n" - - unless okargs.has_key?(opt) -# $stderr.print "Unrecognised option '#{opt}'\n" - @_unrecognised_options.push(opt) - ARGV.delete_at(iptr) - next - end - - if @_count.has_key?(opt) - @_count[opt] += 1 - else - @_count[opt] = 1 - @_option_value[opt] = Array.new - end - - qualifiers = okargs[opt] - - ARGV.delete_at(iptr) - - next unless qualifiers.length > 0 - - if ("s" == qualifiers) - tmp = ARGV[iptr] - @_option_value[opt].push(tmp) - ARGV.delete_at(iptr) - next - end - - if ("i" == qualifiers || "int" == qualifiers) - tmp = ARGV[iptr] - raise "Invalid integer qualifier for -#{opt} option '#{tmp}'" unless tmp =~ /^-*\d+$/ - @_option_value[opt].push(tmp.to_i) - ARGV.delete_at(iptr) - next - end - - if ("u" == qualifiers || "uint" == qualifiers) - tmp = ARGV[iptr] - raise "Invalid unsigned integer qualifier for -#{opt} option '#{tmp}'" unless tmp =~ /^\d+$/ - @_option_value[opt].push(tmp.to_i) - ARGV.delete_at(iptr) - next - end - - if ("ipos" == qualifiers) - tmp = ARGV[iptr] - raise "Invalid positive integer qualifier for -#{opt} option '#{tmp}'" unless tmp =~ /^\d+$/ && tmp.to_i > 0 - @_option_value[opt].push(tmp.to_i) - ARGV.delete_at(iptr) - next - end - - - if ('f' == qualifiers || 'float' == qualifiers) - tmp = ARGV[iptr] - begin - f = Float(tmp) - rescue - raise "Invalid float for '-#{opt}', '#{tmp}'\n" - end - @_option_value[opt].push(tmp.to_f) - ARGV.delete_at(iptr) - next - end - - if ('fraction' == qualifiers) - tmp = ARGV[iptr]; # Must be some way of getting this to work. Want an exception if an invalid number - begin - f = Float(tmp); - rescue - raise "Invalid fraction for '-#{opt}', '#{tmp}'\n" - end - raise "Invalid fraction '#{f}'" unless (f >= 0.0 && f <= 1.0) - @_option_value[opt].push(f) - ARGV.delete_at(iptr) - next - end - - if ("sfile" == qualifiers) - tmp = ARGV[iptr]; - raise "Must specify file name for option '-#{opt}'" unless (tmp) - raise "Missing or empty file '#{tmp}'" unless (FileTest.size?(tmp)) - @_option_value[opt].push(tmp) - ARGV.delete_at(iptr) - next - end - - if ("xfile" == qualifiers) - tmp = ARGV[iptr]; - raise "Must specify file name for option '-#{opt}'" unless (tmp) - raise "Missing or empty file '#{tmp}'" unless (FileTest.executable_real?(tmp)) - @_option_value[opt].push(tmp) - ARGV.delete_at(iptr) - next - end - - if ("dir" == qualifiers) - tmp = ARGV[iptr]; - raise "Must specify file name for option '-#{opt}'" unless (tmp) - raise "Missing or invalid directory file '#{tmp}'" unless (FileTest.directory?(tmp)) - @_option_value[opt].push(tmp) - ARGV.delete_at(iptr) - next - end - - if 'close' == qualifiers - gotclose = false - closing_option = Regexp.new("^-+#{opt}$") - tmp1 = String.new("") - while iptr < ARGV.size - tmp2 = ARGV[iptr] - ARGV.delete_at(iptr) - if (closing_option.match(tmp2)) - gotclose = true - break - else - if (tmp1.length > 0) - tmp1 << ' ' << tmp2 - else - tmp1 << tmp2 - end - end - end - raise "No closing -#{opt}" unless gotclose - @_option_value[opt].push(tmp1) - next - end - - if qualifiers == 'list' - raise "Must specify value for list" unless ARGV[iptr] - ARGV[iptr].split(',').each do |list_member| - @_option_value[opt].push(list_member) - end - ARGV.delete_at(iptr) - next - end - - $stderr.print "IWCmdline:initialize:invalid qualifier '#{qualifiers}' for option '#{opt}', value discarded\n" - ARGV.delete_at(iptr) # just discard it???! - end - end - - def debug_print - end - - def unrecognised_options_encountered - return @_unrecognised_options.size > 0 - end - - def unrecognised_options - return @_unrecognised_options - end - - def option_present (opt) - return (@_count.has_key?(opt)) - end - - def option_count (opt) - return 0 unless @_count.has_key?(opt) - - return @_count[opt] - end - - def value(opt, ndx = 0) - return false unless @_option_value.has_key?(opt) - - tmp = @_option_value[opt] - - return tmp[ndx] - end - - def value_or_empty_string (opt) - return "" unless @_option_value.has_key?(opt) - - tmp = @_option_value[opt] - - return tmp[0] - end - - def values (opt) -# $stderr.print "Do we have '#{opt}' " << (@_option_value.has_key? (opt)).to_s << "\n" - - return [] unless @_option_value.has_key?(opt) - - return @_option_value[opt] - end - - def number_of_these_options_set (opt) - rc = 0 - opt.each { |o| - rc += 1 if @_option_value.has_key?(o) -# $stderr.print "After checking '#{o}' rc = #{rc}\n" - } - - rc - end - -# We may decide to combine two options. - - def combine_options (o1, o2) -# $stderr.print "Combining '#{o1}' with '#{o2}'\n" - if (! @_option_value.has_key?(o1) && ! @_option_value.has_key?(o2)) - return - elsif (! @_option_value.has_key?(o1)) - @_option_value[o1] = Array.new - elsif (! @_option_value.has_key?(o2)) - @_option_value[o2] = Array.new - end - - tmp = @_option_value[o1] | @_option_value[o2] - - @_option_value[o1] = tmp - @_option_value[o2] = tmp - @_count[o1] = tmp.size - @_count[o2] = tmp.size - end - - def values_as_array(opt, separator) - - return [] unless @_option_value.has_key?(opt) - - rc = Array.new - - @_option_value[opt].each do |o| - f = o.split(separator) - f.each do |x| - rc.push(x) - end - end - - return rc - end - -end diff --git a/contrib/script/sh/ap.sh b/contrib/script/sh/ap.sh deleted file mode 100755 index 4abda975..00000000 --- a/contrib/script/sh/ap.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# set up queries for Abraham Platts queries. - -if [ ! -v LILLYMOL_HOME ] ; then - echo "Must set shell variable LILLYMOL_HOME" >&2 - exit 1 -fi - -CONSTANTS=${LILLYMOL_HOME}/data/abraham_hbond_constants - -exec ${LILLYMOL_HOME}/bin/Linux/substituent_model -E autocreate -l \ - -q s:${CONSTANTS} -u -M ap_sa= -M ap_sb= "$@" diff --git a/contrib/script/sh/iwdescr.sh b/contrib/script/sh/iwdescr.sh deleted file mode 100755 index 45e4780a..00000000 --- a/contrib/script/sh/iwdescr.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -if [ ! -v LILLYMOL_HOME ] ; then - echo "Must set shell variable LILLYMOL_HOME" >&2 - exit 1 -fi - -charges="${LILLYMOL_HOME}/contrib/data/queries/charges/queries" -hbonds="${LILLYMOL_HOME}/contrib/data/queries/hbonds" -ranges=${LILLYMOL_HOME}/contrib/data/chembl.ranges - -exec ${LILLYMOL_HOME}/bin/Linux/iwdescr -N F:${charges} \ - -H a=F:${hbonds}/acceptor -H d=${hbonds}/donor.qry -H label \ - -B ranges=${ranges} \ - -l -g all -u 0 -b 5 -O all -B quiet -E autocreate "$@" - diff --git a/contrib/script/sh/jwcats.sh b/contrib/script/sh/jwcats.sh deleted file mode 100755 index d0f2e69c..00000000 --- a/contrib/script/sh/jwcats.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -# Setup queries for jwcats - -if [ ! -v LILLYMOL_HOME ] ; then - echo "Must set shell variable LILLYMOL_HOME" >&2 - exit 1 -fi - -charges="${LILLYMOL_HOME}/contrib/data/queries/charges/queries" -hbonds="${LILLYMOL_HOME}/contrib/data/queries/hbonds" - -exec ${LILLYMOL_HOME}/bin/Linux/jwcats -N noremove -N F:${charges} -H noremove -H a=F:${hbonds}/acceptor -H d=${hbonds}/donor.qry -H label "$@" - diff --git a/data/AAREADME b/data/AAREADME new file mode 100644 index 00000000..8d8ba40a --- /dev/null +++ b/data/AAREADME @@ -0,0 +1,8 @@ +# Data +This directory holds data that has proven to be useful with LillyMol + +There is a mixture of structure files used for unit tests and queries, +reactions, models and other structural information. Many of these +data files/directories will have an associated executable, and +a shell wrapper (in $LILLYMOL_HOME/contrib/bin) that sets up +the executable to use these files. diff --git a/data/LillyMedchemRules/#vinyl_halide_2_halogens.qry# b/data/LillyMedchemRules/#vinyl_halide_2_halogens.qry# new file mode 100644 index 00000000..37badd8d --- /dev/null +++ b/data/LillyMedchemRules/#vinyl_halide_2_halogens.qry# @@ -0,0 +1,22 @@ +e (0 Query + (A I Version 2) + (A C Comment "vinyl_halide_2_halogens") + (0 Query_Atom + (A I atomic_number 6) + (A I aromatic 0) + (A I min_unsaturation 1) +# (A I vinyl 0) + ) + (1 Query_Atom + (A I atomic_number 6) + (A I aromatic 0) + (A I double_bond 0) +# (A I vinyl 0) + ) + + (0 Environment + (A C smarts "[Cl,Br,I]") + (A I hits_needed 2) + (A I single_bond (0 1)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres..rxn b/data/MedchemWizard/Acid_isosteres..rxn new file mode 100644 index 00000000..edb35896 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres..rxn @@ -0,0 +1,16 @@ +(0 Reaction + (A C Comment "Acid_isosteres.") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C(=NOC=1)O AcidIso.") + (A I join (0 0)) + ) +) + ) +) +A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.1.rxn b/data/MedchemWizard/Acid_isosteres.1.rxn new file mode 100644 index 00000000..6a69db41 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.1.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.1") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1ON=C(C=1)O AcidIso.1") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.10.rxn b/data/MedchemWizard/Acid_isosteres.10.rxn new file mode 100644 index 00000000..1290739c --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.10.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.10") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "C(NC1=NNN=N1)=O AcidIso.10") + (A C smarts "C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.11.rxn b/data/MedchemWizard/Acid_isosteres.11.rxn new file mode 100644 index 00000000..27d6c6f2 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.11.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.11") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "C(=O)C1=NNN=N1 AcidIso.11") + (A C smarts "C=O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.12.rxn b/data/MedchemWizard/Acid_isosteres.12.rxn new file mode 100644 index 00000000..a3fe3e67 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.12.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.12") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "N1OC(NC1=O)=O AcidIso.12") + (A C smarts "no") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.13.rxn b/data/MedchemWizard/Acid_isosteres.13.rxn new file mode 100644 index 00000000..141503ae --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.13.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.13") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "C1=NOC(N1)=CO AcidIso.13") + (A C smarts "C=N") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.14.rxn b/data/MedchemWizard/Acid_isosteres.14.rxn new file mode 100644 index 00000000..8dbbe1b3 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.14.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.14") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "SC=1NC(NN=1)=O AcidIso.14") + (A C smarts "S") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.15.rxn b/data/MedchemWizard/Acid_isosteres.15.rxn new file mode 100644 index 00000000..f97e279c --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.15.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.15") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "SC=1NC=NN=1 AcidIso.15") + (A C smarts "S") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.16.rxn b/data/MedchemWizard/Acid_isosteres.16.rxn new file mode 100644 index 00000000..3dfae9dd --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.16.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.16") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[S:2](C=1NC=NN=1)=O AcidIso.16") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.17.rxn b/data/MedchemWizard/Acid_isosteres.17.rxn new file mode 100644 index 00000000..98afd70a --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.17.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.17") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "S(C=1NC=NN=1)(=O)=O AcidIso.17") + (A C smarts "S") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.18.rxn b/data/MedchemWizard/Acid_isosteres.18.rxn new file mode 100644 index 00000000..1c0812c4 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.18.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.18") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "C1=CC=NN1O AcidIso.18") + (A C smarts "c1ccnn1O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.19.rxn b/data/MedchemWizard/Acid_isosteres.19.rxn new file mode 100644 index 00000000..2bb01c56 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.19.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.19") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "C1=CN=NN1O AcidIso.19") + (A C smarts "c1cnnn1O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.2.rxn b/data/MedchemWizard/Acid_isosteres.2.rxn new file mode 100644 index 00000000..c84511fd --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.2.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.2") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C(=NOC=1)O AcidIso.2") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.20.rxn b/data/MedchemWizard/Acid_isosteres.20.rxn new file mode 100644 index 00000000..2a528d73 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.20.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.20") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]1=NC=CN1O AcidIso.20") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.21.rxn b/data/MedchemWizard/Acid_isosteres.21.rxn new file mode 100644 index 00000000..1e6a5861 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.21.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.21") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]1=CN=CN1O AcidIso.21") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.22.rxn b/data/MedchemWizard/Acid_isosteres.22.rxn new file mode 100644 index 00000000..2b2d1a41 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.22.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.22") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[N:2]1S(NC(C1)=O)(=O)=O AcidIso.22") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.23.rxn b/data/MedchemWizard/Acid_isosteres.23.rxn new file mode 100644 index 00000000..676b262f --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.23.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.23") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[N:2]1C(NS(C1)(=O)=O)=O AcidIso.23") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.24.rxn b/data/MedchemWizard/Acid_isosteres.24.rxn new file mode 100644 index 00000000..68b6b83e --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.24.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.24") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]1SC(NC1=O)=O AcidIso.24") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.25.rxn b/data/MedchemWizard/Acid_isosteres.25.rxn new file mode 100644 index 00000000..0ab63332 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.25.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.25") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]1OC(NC1=O)=O AcidIso.25") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.26.rxn b/data/MedchemWizard/Acid_isosteres.26.rxn new file mode 100644 index 00000000..6c5b9400 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.26.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.26") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[N:2]1CC(C(C1=O)=CO)=O AcidIso.26") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.27.rxn b/data/MedchemWizard/Acid_isosteres.27.rxn new file mode 100644 index 00000000..677f5a31 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.27.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.27") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C(OCC=1O)=O AcidIso.27") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.28.rxn b/data/MedchemWizard/Acid_isosteres.28.rxn new file mode 100644 index 00000000..b241798a --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.28.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.28") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C(C(C=1O)=O)=O AcidIso.28") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.29.rxn b/data/MedchemWizard/Acid_isosteres.29.rxn new file mode 100644 index 00000000..af1c5cde --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.29.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.29") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[N:2]C=1C(C(C=1O)=O)=O AcidIso.29") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.3.rxn b/data/MedchemWizard/Acid_isosteres.3.rxn new file mode 100644 index 00000000..70151da9 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.3.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.3") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C(=NON=1)O AcidIso.3") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.30.rxn b/data/MedchemWizard/Acid_isosteres.30.rxn new file mode 100644 index 00000000..ffb63551 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.30.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.30") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[P:2](=O)(O)O AcidIso.30") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.31.rxn b/data/MedchemWizard/Acid_isosteres.31.rxn new file mode 100644 index 00000000..65f3fd7e --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.31.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.31") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[P:2](=O)(OC)O AcidIso.31") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.32.rxn b/data/MedchemWizard/Acid_isosteres.32.rxn new file mode 100644 index 00000000..8cb88328 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.32.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Acid_isosteres.32") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "S(=O)(=O)O AcidIso.32") + (A C smarts "S") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.33.rxn b/data/MedchemWizard/Acid_isosteres.33.rxn new file mode 100644 index 00000000..4049eba0 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.33.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.33") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2](=O)NS(=O)(=O)C AcidIso.33") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.34.rxn b/data/MedchemWizard/Acid_isosteres.34.rxn new file mode 100644 index 00000000..3cd1d54f --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.34.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.34") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[S:2](=O)(NS(=O)(=O)C)=O AcidIso.34") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.35.rxn b/data/MedchemWizard/Acid_isosteres.35.rxn new file mode 100644 index 00000000..34d15426 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.35.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.35") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2](NO)=O AcidIso.35") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.36.rxn b/data/MedchemWizard/Acid_isosteres.36.rxn new file mode 100644 index 00000000..f48c44b8 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.36.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.36") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2](NOC)=O AcidIso.36") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.37.rxn b/data/MedchemWizard/Acid_isosteres.37.rxn new file mode 100644 index 00000000..49d446d6 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.37.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.37") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2](=O)C(C(=O)OC)S(=O)(=O)C AcidIso.37") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.38.rxn b/data/MedchemWizard/Acid_isosteres.38.rxn new file mode 100644 index 00000000..ce1fa1de --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.38.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.38") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2](=O)C(C#N)S(=O)(=O)C AcidIso.38") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.39.rxn b/data/MedchemWizard/Acid_isosteres.39.rxn new file mode 100644 index 00000000..5941ebdf --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.39.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.39") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2](=NS(C(F)(F)F)(=O)=O)NS(=O)(=O)C(F)(F)F AcidIso.39") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.4.rxn b/data/MedchemWizard/Acid_isosteres.4.rxn new file mode 100644 index 00000000..d121e728 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.4.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.4") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]1=NN=C(O1)NS(=O)(=O)C AcidIso.4") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.40.rxn b/data/MedchemWizard/Acid_isosteres.40.rxn new file mode 100644 index 00000000..767fff27 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.40.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.40") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "c1cc(c(c(c1)F)O)F AcidIso.40") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.41.rxn b/data/MedchemWizard/Acid_isosteres.41.rxn new file mode 100644 index 00000000..d005432d --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.41.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.41") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[S:2](=O)(=O)N AcidIso.41") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.42.rxn b/data/MedchemWizard/Acid_isosteres.42.rxn new file mode 100644 index 00000000..232c58e8 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.42.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.42") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[N:2]C(NS(C)(=O)=O)=O AcidIso.42") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.43.rxn b/data/MedchemWizard/Acid_isosteres.43.rxn new file mode 100644 index 00000000..85010989 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.43.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.43") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1NC(C=C(C=1)O)=O AcidIso.43") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.44.rxn b/data/MedchemWizard/Acid_isosteres.44.rxn new file mode 100644 index 00000000..662c10d2 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.44.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.44") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C(=CC(NC=1)=O)O AcidIso.44") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.45.rxn b/data/MedchemWizard/Acid_isosteres.45.rxn new file mode 100644 index 00000000..572a02ba --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.45.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.45") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C=C(C(NC=1)=O)O AcidIso.45") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.46.rxn b/data/MedchemWizard/Acid_isosteres.46.rxn new file mode 100644 index 00000000..87171788 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.46.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.46") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1NC(C(=CC=1)O)=O AcidIso.46") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.5.rxn b/data/MedchemWizard/Acid_isosteres.5.rxn new file mode 100644 index 00000000..737c2aa9 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.5.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.5") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]1=NN=C(N1)NS(=O)(=O)C AcidIso.5") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.6.rxn b/data/MedchemWizard/Acid_isosteres.6.rxn new file mode 100644 index 00000000..0696d9f7 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.6.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.6") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C(=NSC=1)O AcidIso.6") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.7.rxn b/data/MedchemWizard/Acid_isosteres.7.rxn new file mode 100644 index 00000000..bc543913 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.7.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.7") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1C(=NSN=1)O AcidIso.7") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.8.rxn b/data/MedchemWizard/Acid_isosteres.8.rxn new file mode 100644 index 00000000..c80ed829 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.8.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.8") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[N:2]1N=NNC1=O AcidIso.8") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.9.rxn b/data/MedchemWizard/Acid_isosteres.9.rxn new file mode 100644 index 00000000..8b6f4537 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.9.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Acid_isosteres.9") + (0 Scaffold + (A C smarts "[CD3](=O)[OD1]") + (A I remove_atom (1 2)) + ) + (1 Sidechain + (A C smiles "[C:2]=1N=NNN=1 AcidIso.9") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Acid_isosteres.rb b/data/MedchemWizard/Acid_isosteres.rb new file mode 100755 index 00000000..2a33bfd7 --- /dev/null +++ b/data/MedchemWizard/Acid_isosteres.rb @@ -0,0 +1,89 @@ +#!/usr/bin/env ruby + +ianhome = "/home/rx87851" + +require "#{ianhome}/ruby/lib/iwcmdline.rb" +#require "#{ianhome}/ruby/lib/iwcmdline_v2.rb" +require "#{ianhome}/ruby/lib/bindir.rb" + +$expert = false + +def usage (rc) + $stderr.print "Process the Simple H Replacement file\n" + $stderr.print " -expert more options\n" unless ($expert) + $stderr.print " -v verbose output\n" + exit(rc) +end + +# [*:1][C:2]([OH])=O>>[*:1][C:2]=1ON=C(C=1)O +# [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(=NOC=1)O +# [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(=NON=1)O +# IWCmdlineV2 if using v2 + +cl = IWCmdline.new("-v-expert-bindir=dir-keep") + +$expert = cl.option_present('expert') + +if cl.unrecognised_options_encountered() + $stderr.print "Unrecognised options encountered\n" + usage(1) +end + +verbose = cl.option_present('v') + +bindir = Bindir.new(ianhome) + +if cl.option_present('bindir') + cl.values('bindir').each do |d| + bindir.add_dir(d) + end +end + +if 0 == ARGV.size + $stderr.print "Insufficient arguments\n" + usage(2) +end + +ndx = 1 +ARGF.each do |line| + f = line.chomp.split + next if 0 == f.size + rxn = f.shift + + name = f.join('_') + name.gsub!('"', '') + name.gsub!(',', '-') + + j = rxn.split('>>') + $stderr << "Reagents #{j[0]} products #{j[1]} name #{name}\n" + + if "" == name + name = "#{ndx}" + ndx += 1 + end + + fname = "Acid_isosteres.#{name}.rxn" + outp = File.open(fname, "w") + outp << "(0 Reaction\n" + outp << " (A C Comment \"Acid_isosteres.#{name}\")\n" + outp << " (0 Scaffold\n" + if "[*:1][C:2]([OH])=O" == j[0] + outp << " (A C smarts \"[CD3](=O)[OD1]\")\n" + else + $stderr << "Unrecognised lhs '#{j[0]}'\n" + exit 1 + end + outp << " (A I remove_atom (1 2))\n" + outp << " )\n" + + if ! j[1].start_with?("[*:1]") + $stderr << "Unrecognised RHS '#{j[1]}'\n" + exit 1 + end + + outp << " (1 Sidechain\n" + outp << " (A C smiles \"#{j[1][5,99]} AcidIso.#{name}\")\n" + outp << " (A I join (0 0))\n" + outp << " )\n" + outp << ")\n" +end diff --git a/data/MedchemWizard/Aryl_group_addition.add_2-pyridyl.rxn b/data/MedchemWizard/Aryl_group_addition.add_2-pyridyl.rxn new file mode 100644 index 00000000..6ce0d975 --- /dev/null +++ b/data/MedchemWizard/Aryl_group_addition.add_2-pyridyl.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [H:1]>>[cR1:1]1[nR1][cR1][cR1][cR1][cR1]1 add 2-pyridyl + + (A C Comment "Aryl_group_addition.add_2-pyridyl") + (0 Scaffold + (A C smarts "[H>0]") + ) + (1 Sidechain + (A C smiles "C1=NC=CC=C1") + (A C smarts "c") + (A I max_matches 1) + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_group_addition.add_3-pyridyl.rxn b/data/MedchemWizard/Aryl_group_addition.add_3-pyridyl.rxn new file mode 100644 index 00000000..5e479a8e --- /dev/null +++ b/data/MedchemWizard/Aryl_group_addition.add_3-pyridyl.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [H:1]>>[cR1:1]1[cR1][nR1][cR1][cR1][cR1]1 add 3-pyridyl + + (A C Comment "Aryl_group_addition.add_3-pyridyl") + (0 Scaffold + (A C smarts "[H>0]") + ) + (1 Sidechain + (A C smiles "C1=CN=CC=C1") + (A C smarts "c") + (A I max_matches 1) + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_group_addition.add_4-pyridyl.rxn b/data/MedchemWizard/Aryl_group_addition.add_4-pyridyl.rxn new file mode 100644 index 00000000..13499a52 --- /dev/null +++ b/data/MedchemWizard/Aryl_group_addition.add_4-pyridyl.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [H:1]>>[cR1:1]1[cR1][cR1][nR1][cR1][cR1]1 add 4-pyridyl + + (A C Comment "Aryl_group_addition.add_4-pyridyl") + (0 Scaffold + (A C smarts "[H>0]") + ) + (1 Sidechain + (A C smiles "C1=CC=NC=C1") + (A C smarts "c") + (A I max_matches 1) + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_group_addition.add_benzyl.rxn b/data/MedchemWizard/Aryl_group_addition.add_benzyl.rxn new file mode 100644 index 00000000..02f88206 --- /dev/null +++ b/data/MedchemWizard/Aryl_group_addition.add_benzyl.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [H:1]>>[C;H2:1][cR1]1[cR1][cR1][cR1][cR1][cR1]1 add benzyl + + (A C Comment "Aryl_group_addition.add_benzyl") + (0 Scaffold + (A C smarts "[H>0]") + ) + (1 Sidechain + (A C smiles "CC1=CC=CC=C1") + (A C smarts "C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_group_addition.add_phenyl.rxn b/data/MedchemWizard/Aryl_group_addition.add_phenyl.rxn new file mode 100644 index 00000000..f341beda --- /dev/null +++ b/data/MedchemWizard/Aryl_group_addition.add_phenyl.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [H:1]>>[cR1:1]1[cR1][cR1][cR1][cR1][cR1]1 add phenyl + + (A C Comment "Aryl_group_addition.add_phenyl") + (0 Scaffold + (A C smarts "[H>0]") + ) + (1 Sidechain + (A C smiles "C1=CC=CC=C1") + (A C smarts "c") + (A I max_matches 1) + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_Br.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_Br.rxn new file mode 100644 index 00000000..4e69a0de --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_Br.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_Br") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "Br ArylSS.add_Br") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_Cl.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_Cl.rxn new file mode 100644 index 00000000..fa17d1c7 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_Cl.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_Cl") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "Cl ArylSS.add_Cl") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_F.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_F.rxn new file mode 100644 index 00000000..409a5ba9 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_F.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_F") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "F ArylSS.add_F") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_Me.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_Me.rxn new file mode 100644 index 00000000..76fd1e22 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_Me.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_Me") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "C ArylSS.add_Me") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_acetamido.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_acetamido.rxn new file mode 100644 index 00000000..323c27ad --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_acetamido.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_acetamido") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "N(C)C(=O)C ArylSS.add_acetamido") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_carbamoyl.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_carbamoyl.rxn new file mode 100644 index 00000000..cb8c7c70 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_carbamoyl.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_carbamoyl") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "C(=O)N(C)(C) ArylSS.add_carbamoyl") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_carboxylate.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_carboxylate.rxn new file mode 100644 index 00000000..c3839633 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_carboxylate.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_carboxylate") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "C(=O)O ArylSS.add_carboxylate") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_ethoxy.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_ethoxy.rxn new file mode 100644 index 00000000..e445bbe3 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_ethoxy.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_ethoxy") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "OCC ArylSS.add_ethoxy") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_hydroxy.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_hydroxy.rxn new file mode 100644 index 00000000..62f7dcce --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_hydroxy.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_hydroxy") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "O ArylSS.add_hydroxy") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_hydroxymethyl.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_hydroxymethyl.rxn new file mode 100644 index 00000000..e6d17255 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_hydroxymethyl.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_hydroxymethyl") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "CO ArylSS.add_hydroxymethyl") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_methoxy.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_methoxy.rxn new file mode 100644 index 00000000..ef7606b0 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_methoxy.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_methoxy") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "OC ArylSS.add_methoxy") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_methylketone.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_methylketone.rxn new file mode 100644 index 00000000..df951899 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_methylketone.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_methylketone") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "C(=O)C ArylSS.add_methylketone") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_methylsulfone.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_methylsulfone.rxn new file mode 100644 index 00000000..2532773d --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_methylsulfone.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_methylsulfone") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "S(=O)(=O)C ArylSS.add_methylsulfone") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_methylsulfoxide.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_methylsulfoxide.rxn new file mode 100644 index 00000000..68242b29 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_methylsulfoxide.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_methylsulfoxide") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "S(=O)C ArylSS.add_methylsulfoxide") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_nitrile.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_nitrile.rxn new file mode 100644 index 00000000..ff6676d6 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_nitrile.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_nitrile") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "C#N ArylSS.add_nitrile") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_nitrogen.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_nitrogen.rxn new file mode 100644 index 00000000..1d0d7435 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_nitrogen.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_nitrogen") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "N(C)(C) ArylSS.add_nitrogen") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_sulfonamide.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_sulfonamide.rxn new file mode 100644 index 00000000..373ace77 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_sulfonamide.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_sulfonamide") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "NS(=O)(=O)C ArylSS.add_sulfonamide") + (A I join (0 0)) + ) +) + +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_t-butyl.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_t-butyl.rxn new file mode 100644 index 00000000..67900981 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_t-butyl.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_t-butyl") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "C(C)(C)(C) ArylSS.add_t-butyl") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_trifluoromethoxy.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_trifluoromethoxy.rxn new file mode 100644 index 00000000..27c659ad --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_trifluoromethoxy.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_trifluoromethoxy") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "OC(F)(F)(F) ArylSS.add_trifluoromethoxy") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_trifluromethyl.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_trifluromethyl.rxn new file mode 100644 index 00000000..8d04e1b4 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_trifluromethyl.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_trifluromethyl") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "C(F)(F)(F) ArylSS.add_trifluromethyl") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.add_urea.rxn b/data/MedchemWizard/Aryl_substituent_Scan.add_urea.rxn new file mode 100644 index 00000000..b38cb4b1 --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.add_urea.rxn @@ -0,0 +1,10 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_urea") + (0 Scaffold + (A C smarts "[cH1]") + ) + (1 Sidechain + (A C smiles "N(C)C(=O)N(C)(C) ArylSS.add_urea") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Aryl_substituent_Scan.rb b/data/MedchemWizard/Aryl_substituent_Scan.rb new file mode 100755 index 00000000..268046db --- /dev/null +++ b/data/MedchemWizard/Aryl_substituent_Scan.rb @@ -0,0 +1,83 @@ +#!/usr/bin/env ruby + +# [c;H1:1]>>[c:1]F add F +# [c;H1:1]>>[c:1]Cl add Cl +# [c;H1:1]>>[c:1]Br add Br + +ianhome = "/home/rx87851" + +require "#{ianhome}/ruby/lib/iwcmdline.rb" +#require "#{ianhome}/ruby/lib/iwcmdline_v2.rb" +require "#{ianhome}/ruby/lib/bindir.rb" + +$expert = false + +def usage (rc) + $stderr.print "What does this programme do?\n" + $stderr.print " -expert more options\n" unless ($expert) + $stderr.print " -v verbose output\n" + exit(rc) +end + +# IWCmdlineV2 if using v2 + +cl = IWCmdline.new("-v-expert-bindir=dir-keep") + +$expert = cl.option_present('expert') + +if cl.unrecognised_options_encountered() + $stderr.print "Unrecognised options encountered\n" + usage(1) +end + +verbose = cl.option_present('v') + +bindir = Bindir.new(ianhome) + +if cl.option_present('bindir') + cl.values('bindir').each do |d| + bindir.add_dir(d) + end +end + +if 0 == ARGV.size + $stderr.print "Insufficient arguments\n" + usage(2) +end + +ARGF.each do |line| + f = line.chomp.split + next if 0 == f.size + rxn = f.shift + + name = f.join('_') + name.gsub!('"', '') + name.gsub(',', '-') + + j = rxn.split('>>') + $stderr << "Reagents #{j[0]} products #{j[1]} name #{name}\n" + + fname = "Aryl_substituent_Scan.#{name}.rxn" + outp = File.open(fname, "w") + outp << "(0 Reaction\n" + outp << " (A C Comment \"Simple_H_Replacement.#{name}\")\n" + outp << " (0 Scaffold\n" + if "[c;H1:1]" == j[0] + outp << " (A C smarts \"[cH1]\")\n" + else + $stderr << "Unrecognised lhs '#{j[0]}'\n" + exit 1 + end + outp << " )\n" + + if ! j[1].start_with?("[c:1]") + $stderr << "RHS not aromatic '#{j[1]}'\n" + exit 1 + end + + outp << " (1 Sidechain\n" + outp << " (A C smiles \"#{j[1][5,99]} ArylSS.#{name}\")\n" + outp << " (A I join (0 0))\n" + outp << " )\n" + outp << ")\n" +end diff --git a/data/MedchemWizard/Ester-amide_isosteres..rxn b/data/MedchemWizard/Ester-amide_isosteres..rxn new file mode 100644 index 00000000..141caf11 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres..rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]c1cncc(n1)[#6:2] + + (A C Comment "Ester-amide_isosteres.") + (0 Scaffold + (A C smarts "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]") + ) + (1 Sidechain + (A C smiles "Cc1cncc(n1)C ARGA.") + (A C smarts "Cc1cncc(n1)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.1-3-4_oxadiazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.1-3-4_oxadiazole.rxn new file mode 100644 index 00000000..e59f6284 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.1-3-4_oxadiazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]1=N[#6](=[#7][#8]1)[#6:2] 1,3,4 oxadiazole + + (A C Comment "Ester-amide_isosteres.1-3-4_oxadiazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "C1=NOC=N1") + (A C smarts "c1nocn1") + (A I join (0 0)) + (A I join (4 3)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.2_pyrazine.rxn b/data/MedchemWizard/Ester-amide_isosteres.2_pyrazine.rxn new file mode 100644 index 00000000..6f89de86 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.2_pyrazine.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]c1cnc(cn1)[#6:2] pyrazine + + (A C Comment "Ester-amide_isosteres.pyrazine_1") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "C1=NC=CN=C1") + (A C smarts "c1cnccn1") + (A I join (0 1)) + (A I join (4 3)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_1-2-3_triazole.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_1-2-3_triazole.rxn new file mode 100644 index 00000000..a808f0d6 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_1-2-3_triazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]1=[#6][#7]([#7]=[#7]1)[#6:2] --> 1,2,3 triazole + + (A C Comment "Ester-amide_isosteres._T_1-2-3_triazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "N1N=NC=C1") + (A C smarts "n1nncc1") + (A I join (0 0)) + (A I join (4 3)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_1-2-4_oxadiazole.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_1-2-4_oxadiazole.rxn new file mode 100644 index 00000000..eada975f --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_1-2-4_oxadiazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]c=1oc(=nn=1)[#6:2] --> 1,2,4 oxadiazole + + (A C Comment "Ester-amide_isosteres._T_1-2-4_oxadiazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "C1=NN=CO1") + (A C smarts "c1nnco1") + (A I join (0 0)) + (A I join (4 3)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_1-2-4_triazole.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_1-2-4_triazole.rxn new file mode 100644 index 00000000..8ca20b6d --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_1-2-4_triazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]=1[#7][#6](=[#7][#7]=1)[#6:2] --> 1,2,4 triazole + + (A C Comment "Ester-amide_isosteres._T_1-2-4_triazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "C1=NN=CN1") + (A C smarts "c1nncn1") + (A I join (0 0)) + (A I join (4 3)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_1-trifluoromethyl.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_1-trifluoromethyl.rxn new file mode 100644 index 00000000..2e4d7842 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_1-trifluoromethyl.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C(N[#6:2])C(F)(F)F --> 1-trifluoromethyl + + (A C Comment "Ester-amide_isosteres._T_1-trifluoromethyl") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "N-C(C(F)(F)F)C") + (A C smarts "N-C(C(F)(F)F)C") + (A I join (0 0)) + (A I join (4 6)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_cyclopropylamine.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_cyclopropylamine.rxn new file mode 100644 index 00000000..c671e4dc --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_cyclopropylamine.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C1(N[#6:2])CC1 --> cyclopropylamine + + (A C Comment "Ester-amide_isosteres._T_cyclopropylamine") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "N-C1(CC1)C") + (A C smarts "N-C1(CC1)C") + (A I join (0 0)) + (A I join (4 4)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_fluorovinyl.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_fluorovinyl.rxn new file mode 100644 index 00000000..987aaa0b --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_fluorovinyl.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C(=C[#6:2])F --> fluorovinyl + + (A C Comment "Ester-amide_isosteres._T_fluorovinyl") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "C=CF") + (A C smarts "C=CF") + (A I join (0 0)) + (A I join (4 1)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_oxetane.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_oxetane.rxn new file mode 100644 index 00000000..b83866fd --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_oxetane.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C1(N[#6:2])COC1 --> oxetane + + (A C Comment "Ester-amide_isosteres._T_oxetane") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1COC1") + (A C smarts "NC1COC1") + (A I join (0 0)) + (A I join (4 1)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_oxetane_ether.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_oxetane_ether.rxn new file mode 100644 index 00000000..8c5db2f6 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_oxetane_ether.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C1(O[#6:2])COC1 --> oxetane ether + + (A C Comment "Ester-amide_isosteres._T_oxetane_ether") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "OC1COC1") + (A C smarts "OC1COC1") + (A I join (0 0)) + (A I join (4 1)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres._T_sulfonamide.rxn b/data/MedchemWizard/Ester-amide_isosteres._T_sulfonamide.rxn new file mode 100644 index 00000000..25f1d509 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres._T_sulfonamide.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]-S(=O)(=O)N[#6:2] --> sulfonamide + + (A C Comment "Ester-amide_isosteres._T_sulfonamide") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "N-S(=O)(=O)C") + (A C smarts "N-S(=O)(=O)C") + (A I join (0 0)) + (A I join (4 4)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.amidine.rxn b/data/MedchemWizard/Ester-amide_isosteres.amidine.rxn new file mode 100644 index 00000000..941889fe --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.amidine.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C(=NC)N[#6:2] amidine + + (A C Comment "Ester-amide_isosteres.amidine") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC=NC") + (A C smarts "NC=NC") + (A I join (0 0)) + (A I join (4 1)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.amino-1-3-4-_oxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.amino-1-3-4-_oxazole.rxn new file mode 100644 index 00000000..f42699ac --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.amino-1-3-4-_oxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]Nc1=nc(=no1)[#6:1] amino-1,3,4- oxazole + + (A C Comment "Ester-amide_isosteres.amino-1-3-4-_oxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1=NC=NO1") + (A C smarts "Nc1ncno1") + (A I join (0 0)) + (A I join (4 3)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.amino_1-2-4-oxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.amino_1-2-4-oxazole.rxn new file mode 100644 index 00000000..4be2a601 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.amino_1-2-4-oxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]Nc=1oc(=nn=1)[#6:1] amino 1,2,4-oxazole + + (A C Comment "Ester-amide_isosteres.amino_1-2-4-oxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1=NN=CO1") + (A C smarts "Nc1nnco1") + (A I join (0 0)) + (A I join (4 4)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.amino_oxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.amino_oxazole.rxn new file mode 100644 index 00000000..7ae9a7cb --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.amino_oxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]=1[#8][#6](=[#7][#6]=1)N[#6:2] amino oxazole + + (A C Comment "Ester-amide_isosteres.amino_oxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1=NC=CO1") + (A C smarts "Nc1ncco1") + (A I join (0 0)) + (A I join (4 4)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.cyano_oxime.rxn b/data/MedchemWizard/Ester-amide_isosteres.cyano_oxime.rxn new file mode 100644 index 00000000..ac53620d --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.cyano_oxime.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]C(C#N)=NO[#6:1] cyano oxime + + (A C Comment "Ester-amide_isosteres.cyano_oxime") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "ON=CC#N") + (A C smarts "ON=CC#N") + (A I join (0 0)) + (A I join (4 2)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.isomeric_amino-1-3-4-_oxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.isomeric_amino-1-3-4-_oxazole.rxn new file mode 100644 index 00000000..3f76ffca --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.isomeric_amino-1-3-4-_oxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]Nc=1n=c(on=1)[#6:1] isomeric amino-1,3,4- oxazole + + (A C Comment "Ester-amide_isosteres.isomeric_amino-1-3-4-_oxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1=NOC=N1") + (A C smarts "Nc1nocn1") + (A I join (0 0)) + (A I join (4 4)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.isomeric_reversed_amino-1-3-4-_oxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.isomeric_reversed_amino-1-3-4-_oxazole.rxn new file mode 100644 index 00000000..6ae1dc33 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.isomeric_reversed_amino-1-3-4-_oxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]Nc=1n=c(on=1)[#6:2] isomeric reversed amino-1,3,4- oxazole + + (A C Comment "Ester-amide_isosteres.isomeric_reversed_amino-1-3-4-_oxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1=NOC=N1") + (A C smarts "Nc1nocn1") + (A I join (0 0)) + (A I join (4 4)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.isoxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.isoxazole.rxn new file mode 100644 index 00000000..f7552d5a --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.isoxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]=1[#8][#7]=[#6]([#6]=1)O[#6:2] isoxazole + + (A C Comment "Ester-amide_isosteres.isoxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "OC1=NOC=C1") + (A C smarts "Oc1nocc1") + (A I join (0 0)) + (A I join (4 4)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.pyrazine.rxn b/data/MedchemWizard/Ester-amide_isosteres.pyrazine.rxn new file mode 100644 index 00000000..a78092c2 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.pyrazine.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]c1cnc(cn1)[#6:2] pyrazine + + (A C Comment "Ester-amide_isosteres.pyrazine") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "C1=NC=CN=C1") + (A C smarts "c1cnccn1") + (A I join (0 0)) + (A I join (4 3)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.reverse_1-3-4_oxadiazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.reverse_1-3-4_oxadiazole.rxn new file mode 100644 index 00000000..d11744bb --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.reverse_1-3-4_oxadiazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2][#6]1=N[#6](=[#7][#8]1)[#6:1] reverse 1,3,4 oxadiazole + + (A C Comment "Ester-amide_isosteres.reverse_1-3-4_oxadiazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "C1=NOC=N1") + (A C smarts "c1nocn1") + (A I join (0 3)) + (A I join (4 0)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.reverse_amidine.rxn b/data/MedchemWizard/Ester-amide_isosteres.reverse_amidine.rxn new file mode 100644 index 00000000..d8854c22 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.reverse_amidine.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]C(=NC)N[#6:1] reverse amidine + + (A C Comment "Ester-amide_isosteres.reverse_amidine") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC=NC") + (A C smarts "NC=NC") + (A I join (0 1)) + (A I join (4 0)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.reverse_amino_oxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.reverse_amino_oxazole.rxn new file mode 100644 index 00000000..4d6d640f --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.reverse_amino_oxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2][#6]=1[#8][#6](=[#7][#6]=1)N[#6:1] reverse amino oxazole + + (A C Comment "Ester-amide_isosteres.reverse_amino_oxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1=NC=CO1") + (A C smarts "Nc1ncco1") + (A I join (0 4)) + (A I join (4 0)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.reverse_cyano_oxime.rxn b/data/MedchemWizard/Ester-amide_isosteres.reverse_cyano_oxime.rxn new file mode 100644 index 00000000..fd835d84 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.reverse_cyano_oxime.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]C(C#N)=NO[#6:1] cyano oxime + + (A C Comment "Ester-amide_isosteres.cyano_oxime") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "ON=CC#N") + (A C smarts "ON=CC#N") + (A I join (0 2)) + (A I join (4 0)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.reverse_tetrazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.reverse_tetrazole.rxn new file mode 100644 index 00000000..1821147e --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.reverse_tetrazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2][#6]=1[#7]([#7]=[#7][#7]=1)[#6:1] reverse tetrazole + + (A C Comment "Ester-amide_isosteres.reverse_tetrazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "N1N=CN=N1") + (A C smarts "n1ncnn1") + (A I join (0 2)) + (A I join (4 0)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.reverse_triazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.reverse_triazole.rxn new file mode 100644 index 00000000..a053a335 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.reverse_triazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2][#6]1=[#6][#7]([#7]=[#7]1)[#6:1] reverse triazole + + (A C Comment "Ester-amide_isosteres.reverse_triazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "N1N=NC=C1") + (A C smarts "n1nncc1") + (A I join (0 3)) + (A I join (4 0)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.reversed_amino-1-2-4-oxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.reversed_amino-1-2-4-oxazole.rxn new file mode 100644 index 00000000..4b2ea17f --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.reversed_amino-1-2-4-oxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]Nc=1oc(=nn=1)[#6:2] reversed amino-1,2,4-oxazole + + (A C Comment "Ester-amide_isosteres.reversed_amino-1-2-4-oxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1=NN=CO1") + (A C smarts "Nc1nnco1") + (A I join (0 4)) + (A I join (4 0)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.reversed_amino-1-3-4-_oxazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.reversed_amino-1-3-4-_oxazole.rxn new file mode 100644 index 00000000..8f57101a --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.reversed_amino-1-3-4-_oxazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]Nc1=nc(=no1)[#6:2] reversed amino-1,3,4- oxazole + + (A C Comment "Ester-amide_isosteres.reversed_amino-1-3-4-_oxazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "NC1=NOC=N1") + (A C smarts "Nc1nocn1") + (A I join (0 0)) + (A I join (4 4)) + ) +) diff --git a/data/MedchemWizard/Ester-amide_isosteres.tetrazole.rxn b/data/MedchemWizard/Ester-amide_isosteres.tetrazole.rxn new file mode 100644 index 00000000..fa32ad09 --- /dev/null +++ b/data/MedchemWizard/Ester-amide_isosteres.tetrazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]=1[#7]([#7]=[#7][#7]=1)[#6:2] tetrazole + + (A C Comment "Ester-amide_isosteres.tetrazole") + (0 Scaffold + (A C smarts "[CX4R<2]-[N,O;R<2]-C(=O)-[#6R<2]") + (A I embeddings_do_not_overlap 1) + (A I remove_atom (1 2 3)) + ) + (1 Sidechain + (A C smiles "N1N=CN=N1") + (A C smarts "n1ncnn1") + (A I join (0 0)) + (A I join (4 2)) + ) +) diff --git a/data/MedchemWizard/MedChemWizard_reactions.txt b/data/MedchemWizard/MedChemWizard_reactions.txt new file mode 100755 index 00000000..61bee300 --- /dev/null +++ b/data/MedchemWizard/MedChemWizard_reactions.txt @@ -0,0 +1,115 @@ +Simple H Replacements Description 1 Aryl substituent Scan Description 3 Aryl group addition Description 4 Switches Description 5 Acid isosteres Empty Virtual Ring Description 7 Metabolism Description 8 Ester/amide isosteres Description 9 Phenol isosteres Description 10 More aryl rings Description 2 Diamine ring morphing Reference 1 Reference 2 Reference 3 Reference 4 +[C:1]>>[C:1]C add methyl [c;H1:1]>>[c:1]F add F [H:1]>>[cR1:1]1[cR1][cR1][cR1][cR1][cR1]1 add phenyl [#6:1][S:2](=O)(=O)-[N:3]-[#6:4]>>[#6:4][S:2](=O)(=O)-[N:3]-[#6:1] reverse sulfonamide [*:1][C:2]([OH])=O>>[*:1][C:2]=1ON=C(C=1)O [c:1]1(aa[c:4]([a:3][a:2]1)[*!F!Br!Cl!I:5])[*!F!Br!Cl!I:6]>>[N:1]([a:2][a:3][C:4]([*!F!Br!Cl!I:5])=O)([*!F!Br!Cl!I:6])[H] break open a 6-ring to form pseudoring [#6:1][#8;H1:2]>>[#6:1][#8:2][#6] OH -> OMe "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]-S(=O)(=O)N[#6:2]" --> sulfonamide [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[a:3]C=C[#7H1:1]1 indole [c:1][n$(n1ccc2c1cccc2):2]>>[n:1][c:2] indole --> indolizine C1CN(CCN1[*:1])[*:2]>>[*:1]NC1C2CN([*:2])CC12 134575-17-0 +[C:1]>>[C:1]CO add hydroxymethyl [c;H1:1]>>[c:1]Cl add Cl [H:1]>>[cR1:1]1[nR1][cR1][cR1][cR1][cR1]1 add 2-pyridyl [#6:1][C:2](=O)[#7:3][#6:4]>>[#6:1][#7:2][C:3](=O)[#6:4] reverse amide [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(=NOC=1)O [c:1]1(aa[c:4]([a:3][a:2]1)[*!F!Br!Cl!I:5])[*!F!Br!Cl!I:6]>>[C:1]([a:2][a:3][N:4]([*!F!Br!Cl!I:5])[H])([*!F!Br!Cl!I:6])=O break open a 6-ring to form pseudoring [#6:1][#8;H1:2]>>[#6:1][#8:2][#6](F) OH -> OCH2F "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C(N[#6:2])C(F)(F)F" --> 1-trifluoromethyl [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]N=C[a:3]1 indazole [c:1][n$(n1c2c(cc1)cccc2):2][c:3]>>[c:1][n:2][n:3] indole --> indazole C1CN(CCN1[*:1])[*:2]>>N1(CC(CC1)CN[*:1])[*:2] 719999-54-9 141774-70-1 +[C:1]>>[C:1]CCO add hydroxyethyl [c;H1:1]>>[c:1]Br add Br [H:1]>>[cR1:1]1[cR1][nR1][cR1][cR1][cR1]1 add 3-pyridyl [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(=NON=1)O [a:1]1([a:2][a:3][a:4]([*!F!Br!Cl!I:5])a1)[*!F!Br!Cl!I:6]>>[N:1]([a:2][a:3][C:4]([*!F!Br!Cl!I:5])=O)([*!F!Br!Cl!I:6])[H] break open a 5- ring to form pseudoring [#6:1][#8;H1:2]>>[#6:1][#8:2][#6](F)(F) OH -> OCHF2 "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C1(N[#6:2])CC1" --> cyclopropylamine [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]C=N[a:3]1 benzimidazole [c;!$(c=[#8]):1]>>[n:1] aryl C --> aryl N C1CN(CCN1[*:1])[*:2]>>C1N(CC2(C1(CN(C2)[*:1])/[H])/[H])[*:2] 141449-85-6 +[C:1]>>[C:1]CC(C)(C)O "add 2,2-dimethylethanol" [c;H1:1]>>[c:1]CO add hydroxymethyl [H:1]>>[cR1:1]1[cR1][cR1][nR1][cR1][cR1]1 add 4-pyridyl [*:1][C:2]([OH])=O>>[*:1][C:2]1=NN=C(O1)NS(=O)(=O)C [a:1]1([a:2][a:3][a:4]([*!F!Br!Cl!I:5])a1)[*!F!Br!Cl!I:6]>>[C:1]([a:2][a:3][N:4]([*!F!Br!Cl!I:5])[H])([*!F!Br!Cl!I:6])=O break open a 5-ring to form pseudoring [#6:1][#8;H1:2]>>[#6:1][#8:2][#6](F)(F)(F) OH -> OCF3 "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C(=C[#6:2])F" --> fluorovinyl [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]N=N[a:3]1 benzotriazole [c:1][n:2]>>[n:1][c:2] cn --> nc C1CN(CCN1[*:1])[*:2]>>C1N(CC(C1)N[*:1])[*:2] 141449-85-6 122536-76-9 +[C:1]>>[C:1]C(=O)[NH2] add carbamoyl [c;H1:1]>>[c:1]OC add methoxy [H:1]>>[C;H2:1][cR1]1[cR1][cR1][cR1][cR1][cR1]1 add benzyl [*:1][C:2]([OH])=O>>[*:1][C:2]1=NN=C(N1)NS(=O)(=O)C [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CC1 create a new ring with CH2-CH2 [#7:1][#6;H3:2]>>[#7:1][#6:2][#6] OMe -> OEt "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C1(N[#6:2])COC1" --> oxetane [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]C(N[a:3]1)=O imidazolone [c:1][c:2][n:3]>>[n:1][c:2][c:3] ccn --> ncc C1CN(CCN1[*:1])[*:2]>>C1N(CCC(C1)N[*:1])[*:2] 73874-95-0 +[C:1]>>[C:1]C(=O)[OH] add carboxylate [c;H1:1]>>[c:1]OCC add ethoxy [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(=NSC=1)O [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]OC1 create a new ring with CH2-O [#7:1][#6;H3:2]>>[#7:1][#6:2][#6][#6] OMe -> OPr "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C1(O[#6:2])COC1" --> oxetane ether [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]C(=O)C)[a:3] acetamide [n:1][c:2][c:3]>>[n:1][n:2][c:3] ncc --> nnc C1CN(CCN1[*:1])[*:2]>>C1C2(C(CN1[*:1])(N(CCC2)[*:2])/[H])/[H] 132414-81-4 +[C:1]>>[C:1]N add amino [c;H1:1]>>[c:1]C#N add nitrile [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(=NSN=1)O [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CO1 create a new ring with O-CH2 [#7:1][#6;H3:2]>>[#7:1][#6:2][#6]([#6])([#6]) OMe -> OiPr "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]=1[#7][#6](=[#7][#7]=1)[#6:2]" "--> 1,2,4 triazole" [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]C(=O)NC)[a:3] N-Me urea [o:1][n:2][c:3]>>[o:1][c:2][n:3] onc --> ocn C1CN(CCN1[*:1])[*:2]>>C1CC2(CCN1[*:1])CN(C2)[*:2] 236406-55-6 +[C:1]>>[C:1]S(=O)(=O)[NH2] add sulfonamide [c;H1:1]>>[c:1]S(=O)(=O)C add methylsulfone [*:1][C:2]([OH])=O>>[*:1][N:2]1N=NNC1=O [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]SC1 create a new ring with CH2-S [cH1:1]1[n:2][c;H1:3][c:4][c:5][c:6]1>>[cH1:1]1[n:2][c:3](C)[c:4][c:5][c:6]1 pyridyl -> 2-methyl pyridyl "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]c=1oc(=nn=1)[#6:2]" "--> 1,2,4 oxadiazole" [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]C(=O)N)[a:3] Urea [o:1][c:2][n:3]>>[o:1][n:2][c:3] ocn --> onc C1CN(CCN1[*:1])[*:2]>>C1C(CCC1(N[*:1])/[H])(N[*:2])/[H] 1197398-99-4 +[C:1]>>[C:1]C[NH][CH2][CH2]S(=O)(=O)[CH3] add CH2-NH-CH2-CH2-methylsulfone [c;H1:1]>>[c:1]C(F)(F)(F) add trifluromethyl [*:1][C:2]([OH])=O>>[*:1][C:2]=1N=NNN=1 [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CS1 create a new ring with S-CH2 [cH1:1]1[n:2][c;H1:3][c:4][c:5][c:6]1>>[c:1]1([c:6][c:5][c:4][c:3]([n:2]1)C)C "pyridyl -> 2,6-dimethylpyridyl" "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>> [#6:1][#6]1=[#6][#7]([#7]=[#7]1)[#6:2]" "--> 1,2,3 triazole" [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]S(=O)(N)=O)[a:3] sulfamide [s:1][n:2][c:3]>>[s:1][c:2][n:3] snc --> scn C1CN(CCN1[*:1])[*:2]>>N1(CC(CCC1)N[*:1])[*:2] 309956-78-3 216854-23-8 +[C:1]>>[C:1]C[C](=O)[OH] add CH2-CO2H [c;H1:1]>>[c:1]S(=O)(=O)[NH2] add sulfonamide [*:1][C:2]([OH])=O>>[*:1][C:2](NC1=NNN=N1)=O [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]COC1 create a new ring with CH2-O-CH2 [cH1:1]1[n:2][c;H1:3][c:4][c:5][c:6]1>>[cH1:1]1[n;+1:2]([#8;-1])[c:3][c:4][c:5][c:6]1 pyridyl -> N-oxide "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>> [#6:2][#6]1=[#6][#7]([#7]=[#7]1)[#6:1]" reverse triazole [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]C(C[a:3]1)=O oxindole [s:1][c:2][n:3]>>[s:1][n:2][c:3] scn --> snc C1CN(CCN1[*:1])[*:2]>>C1(CN(C1)[*:1])N[*:2] 91188-13-5 +[C:1]>>C1N(CCN(C1)C[C:1])C add N-Me piperazine [c;H1:1]>>[c:1]OC(F)(F)(F) add trifluoromethoxy [*:1][C:2]([OH])=O>>[*:1][C:2](=O)C1=NNN=N1 [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CSC1 create a new ring with CH2-S-CH2 [O:1][C;H3:2]>>[O:1][C:2](F) OMe -> OCH2F "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>> [#6:1]c=1n=nn(n=1)[#6:2]" tetrazole [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]C(C([a:3]1)=O)=O isatin [n:1][c:2][c:3][n:4]>>[n:1][c:2][n:3][c:4] nccn --> ncnc C1CN(CCN1[*:1])[*:2]>>C1C2(C(CN1[*:1])(N(CC2)[*:2])/[H])/[H] 132414-81-4 +[C:1]>>C1OCCN(C1)C[C:1] add morpholinyl [c;H1:1]>>[c:1]C(=O)O add carboxylate [*:1][C:2]([OH])=O>>[*:1][N:2]1OC(NC1=O)=O [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CNC1 create a new ring with CH2-N-CH2 [O:1][C;H3:2]>>[O:1][C:2](F)(F) OMe -> OCHF2 "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>> [#6:2]c=1n=nn(n=1)[#6:1]" reverse tetrazole [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([a;H1:3])C[#8;H1:1] hydroxymethyl [n:1][o:2][c:3][n:4]>>[n:1][o:2][n:3][c:4] nocn --> nonc C1CN(CCN1[*:1])[*:2]>>N(CCN[*:1])[*:2] 57260-73-8 +[C:1]>>CN(C)CCO[C:1] "add N,N-dimethylethanolamine" [c;H1:1]>>[c:1]C(=O)C add methylketone [*:1][C:2]([OH])=O>>[*:1][C:2]1=NOC(N1)=CO [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]OCC1 create a new ring with CH2-CH2-O [O:1][C;H3:2]>>[O:1][C:2](F)(F)(F) OMe -> OCF3 "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]1=N[#6](=[#7][#8]1)[#6:2]" "1,3,4 oxadiazole" [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]S(=O)(C)=O)[a:3] sulfonamide [n:1][s:2][c:3][n:4]>>[n:1][s:2][n:3][c:4] nscn --> nsnc C1CN(CCN1[*:1])[*:2]>>N(CCCN[*:1])[*:2] 75178-96-0 +[C:1]>>CN(C)CCCO[C:1] "add N,N-dimethylpropanolamine" [c;H1:1]>>[c:1]C(C)(C)(C) add t-butyl [*:1][C:2]([OH])=O>>[*:1][S:2]C=1NC(NN=1)=O [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CCO1 create a new ring with -O-CH2-CH2 [O:1][C;H3:2]>>[O:1][C:2]1CC1 OMe -> OcPr "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2][#6]1=N[#6](=[#7][#8]1)[#6:1]" "reverse 1,3,4 oxadiazole" [n:1][c:2][c:3]>>[n:1][c:2][n:3] ncc --> ncn C1CN(CCN1[*:1])[*:2]>>N([*:1])CC1CN([*:2])C1 91188-15-7 +[C:1]>>C1N(CCC1)CCO[C:1] add O-CH2-CH2-pyrrolidine [c;H1:1]>>[c:1]N add nitrogen [*:1][C:2]([OH])=O>>[*:1][S:2]C=1NC=NN=1 [A;R1:6]1[AR1:4][AR1:3]([AR1:2][AR1:1][AR1:5]1)[*:7]>>[A:6]([A:5][A:1][A:2])[A:4][A:3][*:7] break open a cyclohexyl [O:1][C;H2:2][C;H3:3]>>[O:1][C:2]1CC1 OEt -> OcPr "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]=1[#8][#6](=[#7][#6]=1)N[#6:2]" amino oxazole [o:1]>>[s:1] o --> s C1CN(CCN1[*:1])[*:2]>>N([*:1])CC1CCCN1[*:2] 719999-54-9 141774-70-1 +[C:1]>>[C:1](C)(C) add ethyl [c;H1:1]>>[c:1]C(=O)N add carbamoyl [*:1][C:2]([OH])=O>>[*:1][S:2](C=1NC=NN=1)=O [A;R1:6]1[AR1:4][AR1:3]([AR1:2][AR1:1][AR1:5]1)[*:7]>>[A:6]([A:4][A:3]([A:2])[*:7])[A:5][A:1] break open a cyclohexyl [O:1][C;H2:2][C;H3:3]>>[O:1][C:2][C:3](F)(F)(F) OEt -> OCH2CF3 "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2][#6]=1[#8][#6](=[#7][#6]=1)N[#6:1]" reverse amino oxazole [n;H1:1]>>[o:1] nH --> O C1CN(CCN1[*:1])[*:2]>>C1CC2(CN1[*:1])CCCN2[*:2] 646055-63-2 +[C:1]>>[C:1](C)(C)(C) add t-butyl [c;H1:1]>>[c:1]NC(=O)C add acetamido [*:1][C:2]([OH])=O>>[*:1][S:2](C=1NC=NN=1)(=O)=O [A;R1:6]1[AR1:4][AR1:3]([AR1:2][AR1:1][AR1:5]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1])[*:7])[A:5] break open a cyclohexyl [c:1]1([c;H1:6][c;H1:5][c;H1:4][c;H1:3][c;H1:2]1)[*:7]>>[c:1]1([c;H1:6][c;H1:5][c:4](F)[c;H1:3][c;H1:2]1)[*:7] Unsubstituted aryl -> 4-F "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1][#6]=1[#8][#7]=[#6]([#6]=1)O[#6:2]" isoxazole [c$(c1ccc[c:2]c1)H1:1][cH1][c:2]>>[s:1][c:2] phenyl --> thiophene C1CN(CCN1[*:1])[*:2]>>C2CC(C1C2CN(C1)[*:1])N[*:2] 185693-12-3 +[C:1]>>C1[C:1]C1 add dimethyl [c;H1:1]>>[c:1]C(=O)N(C) add carbamoyl [*:1][C:2]([OH])=O>>[*:1][C:2]1=CC=NN1O [A;R1:4]1[A;R1:3]([A;R1:2][A;R1:1][A;R1:5]1)[*:7]>>[A:5]([A:1][A:2])[A:4][A:3][*:7] break open a cyclopentyl [c:1]1([c;H1:6][c;H1:5][c;H1:4][c;H1:3][c;H1:2]1)[*:7]>>[c:1]1([c;H1:6][c;H1:5][c:4](Cl)[c;H1:3][c;H1:2]1)[*:7] Unsubstituted aryl -> 4-Cl "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>> [#6:1][#6]=1[#7]([#7]=[#7][#7]=1)[#6:2]" tetrazole [o:1]>>[n:1] o --> NH C1CN(CCN1[*:1])[*:2]>>O1CCN(C2C1CN(C2)[*:1])[*:2] 724460-95-1 +[C:1]>>[C:1]C(=O)N(C) add carbamoyl [c;H1:1]>>[c:1]C(=O)N(C)(C) add carbamoyl [*:1][C:2]([OH])=O>>[*:1][C:2]1=CN=NN1O [A;R1:4]1[A;R1:3]([A;R1:2][A;R1:1][A;R1:5]1)[*:7]>>[A:5][A:1][A:2][A:3]([A:4])[*:7] break open a cyclopentyl [c:1]1([c;H1:6][c;H1:5][c;H1:4][c;H1:3][c;H1:2]1)[*:7]>>[c:1]1([c;H1:6][c;H1:5][c:4](C)[c;H1:3][c;H1:2]1)[*:7] Unsubstituted aryl -> 4-Me "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>> [#6:2][#6]=1[#7]([#7]=[#7][#7]=1)[#6:1]" reverse tetrazole [s:1]>>[n:1] s --> NH C1CN(CCN1[*:1])[*:2]>>C1CCN(CCN1[*:1])[*:2] 112275-50-0 +[C:1]>>[C:1]C(=O)N(C)(C) add carbamoyl [c;H1:1]>>[c:1]C add Me [*:1][C:2]([OH])=O>>[*:1][C:2]1=NC=CN1O [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6]([A:5][A:8][A:1][A:2][A:3][*:7])[A:4] break open a cycloheptyl "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C(C#N)=NO[#6:2]" cyano oxime [n;H1:1]>>[s:1] nH --> s C1CN(CCN1[*:1])[*:2]>>C1C2(CCN(C1)[*:1])CCN(CC2)[*:2] 173405-78-2 +[C:1]>>[C:1]O add hydroxy [c;H1:1]>>[c:1]O add hydroxy [*:1][C:2]([OH])=O>>[*:1][C:2]1=CN=CN1O [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6][A:5][A:8][A:1][A:2][A:3]([A:4])[*:7] break open a cycloheptyl "[cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]F" Biaryl - protect 6 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]C(C#N)=NO[#6:1]" cyano oxime [n:1][n:2][n:3][c:4]>>[n:1][n:2][c:3][n:4] nnnc --> nncn C1CN(CCN1[*:1])[*:2]>>C1C(C(CCC1)/N[*:1])\N[*:2] 180683-64-1 146504-07-6 364385-54-6 365996-30-1 +[C:1]>>[C:1]S(=O)(=O)C add sulfone [c;H1:1]>>[c:1]S(=O)(=O)N(C) add sulfonamide [*:1][C:2]([OH])=O>>[*:1][N:2]1S(NC(C1)=O)(=O)=O [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6][A:4][A:3]([A:2][A:1][A:8][A:5])[*:7] break open a cycloheptyl "[cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Cl" Biaryl - protect 6 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]C(=NC)N[#6:2]" amidine [n:1][o:2][n:3][c:4]>>[n:1][o:2][c:3][n:4] nonc --> nocn C1CN(CCN1[*:1])[*:2]>>N1(CC2(C1)N(CC2)[*:1])[*:2] 1272412-72-2 +[C:1]>>[C:1]S(=O)(=O)N(C) add sulfonamide [c;H1:1]>>[c:1]S(=O)C add methylsulfoxide [*:1][C:2]([OH])=O>>[*:1][N:2]1C(NS(C1)(=O)=O)=O [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1][A:8])[*:7])[A:5] break open a cycloheptyl "[cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]C" Biaryl - protect 6 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]C(=NC)N[#6:1]" reverse amidine [c:1][n:2]>>[n:1][n:2] cn --> nn C1CN(CCN1[*:1])[*:2]>>N1(CC2(C1)C(CC2)N[*:1])[*:2] 1330765-13-3 +[C:1]>>[C:1]S(=O)(=O)N(C)(C) add sulfonamide [c;H1:1]>>[c:1]N(C)C(=O)C add acetamido [*:1][C:2]([OH])=O>>[*:1][C:2]1SC(NC1=O)=O "[cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Br" Biaryl - protect 6 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]c1cnc(cn1)[#6:2]" pyrazine [c$(c1ccc[c:2]c1)H1:1][cH1][c:2]>>[o:1][c:2] phenyl --> furan C1CN(CCN1[*:1])[*:2]>>C1(CCC(CC1)/N[*:1])/N[*:2] 247570-24-7 177906-48-8 +[C:1]>>[C:1]S(=O)C add sulfone [c;H1:1]>>[c:1]NS(=O)(=O)C add sulfonamide [*:1][C:2]([OH])=O>>[*:1][C:2]1OC(NC1=O)=O "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]c1cncc(n1)[#6:2]" c1(ccc(cc1)[*:1])[*:2]>>[*:1]C21CC(C1)(C2)[*:2] "1,4-pheny; --> 2.2.2 tricycle" C1CN(CCN1[*:1])[*:2]>>N1(CCC2(CC1)CN(CCC2)[*:1])[*:2] 102359-51-3 +[C:1]>>[C:1]F add F [c;H1:1]>>[c:1]N(C)S(=O)(=O)C add sulfonamide [*:1][C:2]([OH])=O>>[*:1][N:2]1CC(C(C1=O)=CO)=O "[cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Br" Biaryl - protect 7 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]Nc=1oc(=nn=1)[#6:1]" "amino 1,2,4-oxazole" [n;H0:1]>>[c:1] aryl n --> aryl c C1CN(CCN1[*:1])[*:2]>>C1C2(C(CN1[*:1])(N(C2)[*:2])/[H])/[H] 1017789-34-2 +[C:1]>>[C:1]NC(=O)C add acetamide [c;H1:1]>>[c:1]NC add nitrogen [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(OCC=1O)=O "[cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]F" Biaryl - protect 7 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]Nc=1oc(=nn=1)[#6:2]" "reversed amino-1,2,4-oxazole" [c:1]s[c:2]>>[c:1]cc[c:2] thiophene --> phenyl C1CN(CCN1[*:1])[*:2]>>N1(CC2CCC(C1)N2[*:1])[*:2] 201162-53-0 +[C:1]>>[C:1]NS(=O)(=O)C add sulfonamide [c;H1:1]>>[c:1]N(C)(C) add nitrogen [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(C(C=1O)=O)=O "[cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Cl" Biaryl - protect 7 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]Nc1=nc(=no1)[#6:1]" "amino-1,3,4- oxazole" [c:1]o[c:2]>>[c:1]cc[c:2] furan --> phenyl C1CN(CCN1[*:1])[*:2]>>N1(CC2N(CC1C2)[*:1])[*:2] 113451-59-5 +[C:1]>>[C:1]N(C)S(=O)(=O)C add sulfonamide [c;H1:1]>>[c:1]NC(=O)N add urea [*:1][C:2]([OH])=O>>[*:1][N:2]C=1C(C(C=1O)=O)=O "[cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]C" Biaryl - protect 7 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]Nc1=nc(=no1)[#6:2]" "reversed amino-1,3,4- oxazole" [c:1][n;H1][c:2]>>[c:1]cc[c:2] pyrrole --> phenyl C1CN(CCN1[*:1])[*:2]>>N1(CC2N(CC1CC2)[*:1])[*:2] 615575-74-1 +[C:1]>>[C:1]N(C) add amino [c;H1:1]>>[c:1]N(C)C(=O)N add urea [*:1][C:2]([OH])=O>>[*:1][P:2](=O)(O)O "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:2]Nc=1n=c(on=1)[#6:1]" "isomeric amino-1,3,4- oxazole" [n;r5;R1;H1:1][n:2]>>[n:1]c[n:2] nn --> ncn C1CN(CCN1[*:1])[*:2]>>c:1(:c:c:c(:c:c:1)N[*:1])N[*:2] 71026-66-9 +[C:1]>>[C:1]N(C)(C) add amino [c;H1:1]>>[c:1]NC(=O)N(C) add urea [*:1][C:2]([OH])=O>>[*:1][P:2](=O)(OC)O "[cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]F" Biaryl - protect 4 position "[NX3H1H0,OH0]([CX3](=[OX1])[#6:1])[CX4,c:2]>>[#6:1]Nc=1n=c(on=1)[#6:2]" "isomeric reversed amino-1,3,4- oxazole" [n;r5;R1;H1:1][c:2][n:3]>>[n:1][c:2]c[n:3] ncn --> nccn C1CN(CCN1[*:1])[*:2]>>c:1(:c:c(:c:c:c:1)N[*:1])N[*:2] 68621-88-5 +[N:1]>>[N:1]C(=O)C amine to N-Ac [c;H1:1]>>[c:1]N(C)C(=O)N(C) add urea [*:1][C:2]([OH])=O>>[*:1][S:2](=O)(O)O "[cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]Cl" Biaryl - protect 4 position [n;r5;R1;H1:1][c:2][c:3][n:4]>>[n:1][c:2]c[c:3][n:4] nccn --> ncccn C1CN(CCN1[*:1])[*:2]>>c:1(:c(:c:c:c:c:1)N[*:1])N[*:2] 146651-75-4 +[N:1]>>[N:1]C amine to N-Me [c;H1:1]>>[c:1]NC(=O)N(C)(C) add urea [*:1][C:2]([OH])=O>>[*:1][C:2](=O)NS(=O)(=O)C "[cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]Br" Biaryl - protect 4 position [s:1]>>[o:1] s --> o C1CN(CCN1[*:1])>>O1CCN(CC1)[*:1] 110-91-8 +[N:1]>>[N:1](C)C amine to N-Me2 [c;H1:1]>>[c:1]N(C)C(=O)N(C)(C) add urea [*:1][C:2]([OH])=O>>[*:1][S:2](=O)(NS(=O)(=O)C)=O "[cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]C" Biaryl - protect 4 position [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)cccc2 phenyl --> naphthyl C1CN(CCN1[*:1])>>S1CCN(CC1)[*:1] 123-90-0 +[N:1]>>[N:1]C(=O)OC amine to carbamate [*:1][C:2]([OH])=O>>[*:1][C:2](NO)=O [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)nccc2 phenyl --> quinolinyl C1CN(CCN1[*:1])>>O1CCCN(CC1)[*:1] 178312-62-4 +[N:1]>>[N:1]C(=O)N amine to urea [*:1][C:2]([OH])=O>>[*:1][C:2](NOC)=O [cH1:1][cH0:2]([cH1:4])[OH:3]>>[c:1](C)[cH0:2]([c:4](C))[OH:3] Block ortho to a phenol [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)ccnc2 phenyl -- isoquinolinyl C1CN(CCN1[*:1])[*:2]>>C1(CCN(CC1)[*:1])O[*:2] 109384-19-2 +[N:1]>>[N:1]C(=O)NC amine to urea [*:1][C:2]([OH])=O>>[*:1][C:2](=O)C(C(=O)OC)S(=O)(=O)C [cH1:1][cH0:2][OH:3]>>[c:1](C)[cH0:2][OH:3] Block ortho to a phenol [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)ncnc2 phenyl --> quinazoline C1CN(CCN1[*:1])[*:2]>>C1C(CN(CC1)[*:1])O[*:2] 143900-43-0 143900-44-1 +[N:1]>>[N:1]C(=O)N(C)C amine to urea [*:1][C:2]([OH])=O>>[*:1][C:2](=O)C(C#N)S(=O)(=O)C [cH1:1][cH0:2]([cH1:4])[OH:3]>>[c:1](F)[cH0:2]([c:4](F))[OH:3] Block ortho to a phenol [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)nccn2 phenyl --> quinoxaline C1CN(CCN1[*:1])[*:2]>>C1(CN(C1)[*:1])O[*:2] 141699-55-0 +[N:1]>>[N:1](C)C(=O)C amine to N-Ac [*:1][C:2]([OH])=O>>[*:1][C:2](=NS(C(F)(F)F)(=O)=O)NS(=O)(=O)C(F)(F)F [cH1:1][cH0:2][OH:3]>>[c:1](F)[cH0:2][OH:3] Block ortho to a phenol [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)ncn2 phenyl --> benzimidazole C1CN(CCN1[*:1])[*:2]>>C1(CN(C1)[*:1])(O)C2CCCCN2[*:2] 934664-27-4 934666-06-5 +[N:1]>>[N:1](C)C(=O)OC amine to carbamate [*:1][C:2]([OH])=O>>[*:1][c:2]1cc(c(c(c1)F)O)F [cH1:1][cH0:2]([cH1:4])[OH:3]>>[c:1](Cl)[cH0:2]([c:4](Cl))[OH:3] Block ortho to a phenol [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)ncc2 phenyl --> indole C1CN(CCN1[*:1])[*:2]>>C1(CN(C1)[*:1])(O)C2CCCN(C2)[*:2] virtual +[N:1]>>[N:1](C)C(=O)N amine to urea [*:1][C:2]([OH])=O>>[*:1][S:2](=O)(=O)N [cH1:1][cH0:2][OH:3]>>[c:1](Cl)[cH0:2][OH:3] Block ortho to a phenol [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)nncc2 phenyl --> cinnoline C1CN(CCN1[*:1])[*:2]>>C1(N(CCN([*:1])C1)[*:2])=O 76003-29-7 +[N:1]>>[N:1](C)C(=O)NC amine to urea [*:1][C:2]([OH])=O>>[*:1][N:2]C(NS(C)(=O)=O)=O [cH0:1][OH:2]>>[cH0:1][C:2]O Phenol -> hydroxymethyl [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)cnnc2 phenyl --> phthalazine C1CN(CCN1[*:1])[*:2]>>N(C(CN[*:1])(C)C)[*:2] 95034-05-2 +[N:1]>>[N:1](C)C(=O)N(C)C amine to urea [*:1][C:2]([OH])=O>>[*:1][C:2]=1NC(C=C(C=1)O)=O [O;H1:3][c:1][c:2][O;H1:4]>>[O:3]1[c:1][c:2][O:4]C1 Catechol -> methylenedioxy [a;H1;R1:5]1[a;H1;R1:4][a;R1:3][a;R1:2][n;R1:1]1>>[c:5]21[n;R1:1][a;R1:2][a;R1:3][c:4]1cccc2 pyrrole --> indole C1CN(CCN1[*:1])[*:2]>>N(C1(CN[*:1])CC1)[*:2] 934481-48-8 +[N:1]>>[O:1] nitrogen to oxygen [*:1][C:2]([OH])=O>>[*:1][C:2]=1C(=CC(NC=1)=O)O [a;RH1;1:5]1[a;H1;R1:4][a;R1:3][a;R1:2][n;R1:1]1>>[a;R1:5]1[n;R1:1][a;R1:2][c:3]2[c:4]1cccc2 pyrrole --> isoindole C1CN(CCN1[*:1])[*:2]>>N(CCO[*:1])[*:2] 26690-80-2 + [*:1][C:2]([OH])=O>>[*:1][C:2]=1C=C(C(NC=1)=O)O [C$(Ca);H2:1]>>[C$(Ca);H1:1]O Benzylic oxidation C1CN(CCN1[*:1])>>N(CCO)[*:1] 26690-80-2 + [*:1][C:2]([OH])=O>>[*:1][C:2]=1NC(C(=CC=1)O)=O [C$(Ca);H2:1]>>[C$(Ca);H1:1]C Benzylic substitution C1CN(CCN1[*:1])[*:2]>>C1C2C(CC1)(CN(C2)[*:1])CN[*:2] ChemSpider ID: 9416534 ChemSpider ID: 23014425 + [C$(Ca);H2:1]>>[C$(Ca);H0:1](C)(C) Benzylic substitution C1CN(CCN1[*:1])[*:2]>>C=21C(CN(C1)[*:1])=NN(C=2)[*:2] 1280210-79-8 + [#6:1]C=C[#6:2]>>[#6:1]C1C([#6:2])C1 alkene --> cyclopropyl C1CN(CCN1[*:1])[*:2]>>C=21C(CN(C1)[*:1])=CN(C=2)[*:2] 156422-77-4 + [#6:1]C=C[#6:2]>>[#6:1]OC[#6:2] alkene --> ether C1CN(CCN1[*:1])[*:2]>>N21C(CN(CC1)[*:1])=NN=C2[*:2] 837430-14-5 + [#6:1]C#C[#6:2]>>[#6:1]OC[#6:2] acetylene --> ether C1CN(CCN1[*:1])[*:2]>>N21C(CN(CC1)[*:1])=CN=C2[*:2] 297172-19-1 + [#6:1]C#C[#6:2]>>[#6:1]CC[#6:2] alkene --> alkane C1CN(CCN1[*:1])[*:2]>>C1N2C(CN(C1)[*:1])=NC=C2[*:2] 735266-95-2 + [C;H3:1]>>[C:1]O methyl -> hydroxymethyl C1CN(CCN1[*:1])>>C1CCN(CC1)[*:1] 110-89-4 + C1CN(CCN1[*:1])[*:2]>>C21CC=CCC(N1[*:1])CN(C2)[*:2] DOI: 10.1016/j.tetlet.2007.07.080 + C1CN(CCN1[*:1])[*:2]>>C21CN(C(CN1[*:1])CC=CC2)[*:2] DOI: 10.1016/j.tetlet.2007.07.080 + C1CN(CCN1[*:1])>>C1C=2N(CCN1[*:1])C=CC=2 71257-38-0 + C1CN(CCN1[*:1])[*:2]>>C21(CC(C1)(C2)N[*:1])N[*:2] 148561-75-5 + C1CN(CCN1[*:1])[*:2]>>N(C1C(COC1)N[*:1])[*:2] 335276-55-6 + C1CN(CCN1[*:1])[*:2]>>C1(CC(C1)(N[*:1])/[H])(N[*:2])/[H] 871014-19-6 + C1CN(CCN1[*:1])[*:2]>>C1C(CCN(CCC1)[*:1])N[*:2] 196613-57-7 + C1CN(CCN1[*:1])[*:2]>>C1N([*:1])CCC2C1CCCN2[*:2] 616875-90-2 + C1CN(CCN1[*:1])[*:2]>>C1N([*:1])CCC2(C1)N(CCC2)[*:2] 937729-06-1 + C1CN(CCN1[*:1])[*:2]>>C1N([*:1])CCC2C1N(CCC2)[*:2] DOI: 10.1039/J39670000377 + C1CN(CCN1[*:1])[*:2]>>C1(N[*:1])(CCCC1)CN[*:2] 1311318-21-4 + C1CN(CCN1[*:1])[*:2]>>C1N([*:1])CC(CCC1)N[*:2] 200440-13-7 + C1CN(CCN1[*:1])[*:2]>>C1(N[*:1])CC2(C1)CN(C2)[*:2] 121152-65-6 + C1CN(CCN1[*:1])[*:2]>>N1(CCC2(CC1)CC(C2)CN[*:1])[*:2] ChemSpider ID: 24784612 + C1CN(CCN1[*:1])[*:2]>>C1C(C2(C1)CCN(CC2)[*:1])N[*:2] ChemSpider ID: 24784631 + C1CN(CCN1[*:1])>>C1N2C(CN(C1)[*:1])=NN=C2 837430-14-5 + C1CN(CCN1[*:1])>>C1N2C(CN(C1)[*:1])=NC=C2 735266-95-2 + C1CN(CCN1[*:1])>>C1N2C(CN(C1)[*:1])=CN=C2 837430-14-5 + N1(CCN(CC1)[*:1])[*:2]>>C1CCC(CC1)(N[*:1])CCN[*:2] 1352999-04-2 864943-63-5 + N1(CCN(CC1)[*:1])[*:2]>>N1(CC(OCC1)CN[*:1])[*:2] 110859-47-7 140645-53-0 + N1(CCN(CC1)[*:1])[*:2]>>N([*:1])CC1(CCCCCC1)N[*:2] 904817-67-0 + N1(CCN(CC1)[*:1])[*:2]>>C1C2C(CC(C1)N[*:1])CN(C2)[*:2] 1093230-98-8 + N1(CCN(CC1)[*:1])[*:2]>>C1C2C(CCC1)(CN(C2)[*:1])CN[*:2] EN300-87094 + N1(CCN(CC1)[*:1])[*:2]>>C1N2C(CN(C1)[*:1])CC(C2)N[*:2] EN300-88101 EN300-88102 + N1(CCN(CC1)[*:1])[*:2]>>C1C2=C(CC1N[*:1])CC(C2)N[*:2] EN300-88108 + N1(CCN(CC1)[*:1])[*:2]>>C1C2(C(CN1[*:2])C2)N[*:1] 489438-95-1 + N1(CCN(CC1)[*:1])[*:2]>>N1(CC2C(C1)C2CN[*:1])[*:2] 134575-12-5 + N1(CCN(CC1)[*:1])[*:2]>>N1(CC2C(CC1)(C2)N[*:1])[*:2] EN300-87450 + N1(CCN(CC1)[*:1])[*:2]>>N1(C2C(CCC1)N(CCC2)[*:1])[*:2] 1000931-58-7 + N1(CCN(CC1)[*:1])[*:2]>>N1(C2C(CCC1)CN([*:1])C2)[*:2] 132414-81-4 + N1(CCN(CC1)[*:1])[*:2]>>C1C2C(N(C1C)[*:1])CN(C2)[*:2] 370882-39-6 + N1(CCN(CC1)[*:1])[*:2]>>C21CN(CC(CCC1)N(C2)[*:1])[*:2] EN300-40961 + N1(CCN(CC1)[*:1])[*:2]>>N(C1C2CC(CC1CCC2)N[*:1])[*:2] EN300-87468 + N1(CCN(CC1)[*:1])[*:2]>>N1(C2CC(CC1CCC2)N[*:1])[*:2] 76272-99-6 + N1(CCN(CC1)[*:1])[*:2]>>C1CC2(CC(C1)(N[*:1])C2)N[*:2] EN300-61211 + N1(CCN(CC1)[*:1])[*:2]>>C21(CC(C1)(CC2)N[*:1])N[*:2] EN300-88111 + N1(CCN(CC1)[*:1])[*:2]>>C21CC(C(N(C1)[*:1])C2)N[*:2] 1005077-74-6 + N1(CCN(CC1)[*:1])[*:2]>>C1(CC2(N(CC1)[*:1])CCC2)N[*:2] EN300-26948 + N1(CCN(CC1)[*:1])[*:2]>>C1(CC2(N(CC1)[*:1])CCCCC2)N[*:2] EN300-27604 + N1(CCN(CC1)[*:1])[*:2]>>C1C(N(CC1)[*:1])C2CN(CCC2)[*:2] EN300-29501 + N1(CCN(CC1)[*:1])[*:2]>>C1C(N(CC1)[*:1])C2CCN(CC2)[*:2] 929974-12-9 + N1(CCN(CC1)[*:1])[*:2]>>C1(CN(CC1)[*:1])C2CCN(CC2)[*:2] 929974-10-7 + N1(CCN(CC1)[*:1])[*:2]>>C1(CN(CC1)[*:1])C2CCCCN2[*:2] EN300-87267 + N1(CCN(CC1)[*:1])[*:2]>>C1C(N(CC1)[*:1])C2CCCCN2[*:2] 929974-16-3 + N1(CCN(CC1)[*:1])[*:2]>>C1CN(CCO1)CCN[*:1] 2038-03-1 + N1(CCN(CC1)[*:1])[*:2]>>C1OCCN(C1)CCCN[*:1] 123-00-2 + N1(CCN(CC1)[*:1])[*:2]>>C1CN(CC1)CCCN[*:1] 23159-07-1 + N1(CCN(CC1)[*:1])[*:2]>>C1(N[*:1])CCC(CC1)N2CCOCC2 79099-07-3 + N1(CCN(CC1)[*:1])[*:2]>>C1(N[*:1])CCC(CC1)N2CCCC2 734527-26-5 + N1(CCN(CC1)[*:1])[*:2]>>C1(N[*:1])CCC(CC1)O 5382-16-1 + N1(CCN(CC1)[*:1])[*:2]>>C1(C[*:1])CCN(CC1)C 52694-51-6 + N1(CCN(CC1)[*:1])[*:2]>>C1=NC(=CN1[*:1])[*:2] 822-36-6 + N1(CCN(CC1)[*:1])[*:2]>>C1=NC(=CN1[*:2])[*:1] 822-36-6 + N1(CCN(CC1)[*:1])[*:2]>>C=1N(N=C(N=1)[*:1])[*:2] 7170-01-6 + N1(CCN(CC1)[*:1])[*:2]>>C=1N(N=C(N=1)[*:2])[*:1] 7170-01-6 + N1(CCN(CC1)[*:1])[*:2]>> N1(CCN(CC1)CC)[*:1] 5308-25-8 + N1(CCN(CC1)[*:1])[*:2]>> N1(CCN(CC1)C(C)C)[*:1] 4318-42-7 + N1(CCN(CC1)[*:1])[*:2]>>N1(CCN(CC1)Cc2ccccc2)[*:1] 2759-28-6 + N1(CCN(CC1)[*:1])[*:2]>> N1(CCN(CC1)c2ccccc2)[*:1] 92-54-6 + N1(CCN(CC1)[*:1])[*:2]>>N1(CCN(CC1)CC#C)[*:1] 52070-67-4 + N1(CCN(CC1)[*:1])[*:2]>>N1(CCN(CC1)CCC)[*:1] 64262-23-3 + N1(CCN(CC1)[*:1])[*:2]>>N1(CCN(CC1)CCO)[*:1] 103-76-4 diff --git a/data/MedchemWizard/Metabolism.Benzylic_oxidation.rxn b/data/MedchemWizard/Metabolism.Benzylic_oxidation.rxn new file mode 100644 index 00000000..74e723b1 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Benzylic_oxidation.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [C$(Ca);H2:1]>>[C$(Ca);H1:1]O Benzylic oxidation + + (A C Comment "Metabolism.Benzylic_oxidation") + (0 Scaffold + (A C smarts "[CH2]-a") + ) + (1 Sidechain + (A C smiles "O") + (A C smarts "O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Benzylic_substitution.rxn b/data/MedchemWizard/Metabolism.Benzylic_substitution.rxn new file mode 100644 index 00000000..0b93bfe5 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Benzylic_substitution.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [C$(Ca);H2:1]>>[C$(Ca);H0:1](C)(C) Benzylic substitution + + (A C Comment "Metabolism.Benzylic_substitution") + (0 Scaffold + (A C smarts "[CH2]-a") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Benzylic_substitution_C1.rxn b/data/MedchemWizard/Metabolism.Benzylic_substitution_C1.rxn new file mode 100644 index 00000000..036ece70 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Benzylic_substitution_C1.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [C$(Ca);H2:1]>>[C$(Ca);H0:1](C)(C) Benzylic substitution + + (A C Comment "Metabolism.Benzylic_substitution_C1") + (0 Scaffold + (A C smarts "[CH2]-a") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Benzylic_substitution_C2.rxn b/data/MedchemWizard/Metabolism.Benzylic_substitution_C2.rxn new file mode 100644 index 00000000..8c16b29c --- /dev/null +++ b/data/MedchemWizard/Metabolism.Benzylic_substitution_C2.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [C$(Ca);H2:1]>>[C$(Ca);H0:1](C)(C) Benzylic substitution + + (A C Comment "Metabolism.Benzylic_substitution") + (0 Scaffold + (A C smarts "[CH2]-a") + ) + (1 Sidechain + (A C smiles "C.C") + (A C smarts "C.C") + (A I join (0 0)) + (A I join (0 1)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position.rxn new file mode 100644 index 00000000..b3546883 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 4 position + + (A C Comment "Metabolism.Biaryl_-_protect_4_position_Cl") + (0 Scaffold + (A C smarts "[cD3]1aa[cD2]a2aacaa12") + ) + (1 Sidechain + (A C smiles "Cl") + (A C smarts "Cl") + (A I join (3 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_Br.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_Br.rxn new file mode 100644 index 00000000..05fe4258 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_Br.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 4 position + + (A C Comment "Metabolism.Biaryl_-_protect_4_position_Br") + (0 Scaffold + (A C smarts "[cD3]1aa[cD2]a2aacaa12") + ) + (1 Sidechain + (A C smiles "Br") + (A C smarts "Br") + (A I join (3 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_C.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_C.rxn new file mode 100644 index 00000000..8414bfa1 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_C.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 4 position + + (A C Comment "Metabolism.Biaryl_-_protect_4_position_C") + (0 Scaffold + (A C smarts "[cD3]1aa[cD2]a2aacaa12") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (3 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_Cl.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_Cl.rxn new file mode 100644 index 00000000..b3546883 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_Cl.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 4 position + + (A C Comment "Metabolism.Biaryl_-_protect_4_position_Cl") + (0 Scaffold + (A C smarts "[cD3]1aa[cD2]a2aacaa12") + ) + (1 Sidechain + (A C smiles "Cl") + (A C smarts "Cl") + (A I join (3 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_F.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_F.rxn new file mode 100644 index 00000000..0b4e6498 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_4_position_F.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]([c,n]2[c,n]1[c,n][c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 4 position + + (A C Comment "Metabolism.Biaryl_-_protect_4_position_F") + (0 Scaffold + (A C smarts "[cD3]1aa[cD2]a2aacaa12") + ) + (1 Sidechain + (A C smiles "F") + (A C smarts "F") + (A I join (3 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position.rxn new file mode 100644 index 00000000..b7ad8303 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Br Biaryl - protect 6 position + + (A C Comment "Metabolism.Biaryl_-_protect_6_position_F") + (0 Scaffold + (A C smarts "[cD3]1aaaa2a[cD2]aaa12") + ) + (1 Sidechain + (A C smiles "F") + (A C smarts "F") + (A I join (6 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_Br.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_Br.rxn new file mode 100644 index 00000000..82e9fb59 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_Br.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Br Biaryl - protect 6 position + + (A C Comment "Metabolism.Biaryl_-_protect_6_position_Br") + (0 Scaffold + (A C smarts "[cD3]1aaaa2a[cD2]aaa12") + ) + (1 Sidechain + (A C smiles "Br") + (A C smarts "Br") + (A I join (6 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_C.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_C.rxn new file mode 100644 index 00000000..da6abf83 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_C.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Br Biaryl - protect 6 position + + (A C Comment "Metabolism.Biaryl_-_protect_6_position_C") + (0 Scaffold + (A C smarts "[cD3]1aaaa2a[cD2]aaa12") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (6 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_Cl.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_Cl.rxn new file mode 100644 index 00000000..828eae6e --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_Cl.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Br Biaryl - protect 6 position + + (A C Comment "Metabolism.Biaryl_-_protect_6_position_Cl") + (0 Scaffold + (A C smarts "[cD3]1aaaa2a[cD2]aaa12") + ) + (1 Sidechain + (A C smiles "Cl") + (A C smarts "Cl") + (A I join (6 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_F.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_F.rxn new file mode 100644 index 00000000..d098483b --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_6_position_F.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n]2[c,n]([c,n][c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]Br Biaryl - protect 6 position + + (A C Comment "Metabolism.Biaryl_-_protect_6_position") + (0 Scaffold + (A C smarts "[cD3]1aaaa2a[CD1]aaa12") + ) + (1 Sidechain + (A C smiles "F") + (A C smarts "F") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position.rxn new file mode 100644 index 00000000..49393f49 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 7 position + + (A C Comment "Metabolism.Biaryl_-_protect_7_position_Cl") + (0 Scaffold + (A C smarts "[cD3]1aaaa2aa[cD2]aa12") + ) + (1 Sidechain + (A C smiles "Cl") + (A C smarts "Cl") + (A I join (7 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_Br.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_Br.rxn new file mode 100644 index 00000000..a0871c09 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_Br.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 7 position + + (A C Comment "Metabolism.Biaryl_-_protect_7_position_Br") + (0 Scaffold + (A C smarts "[cD3]1aaaa2aa[cD2]aa12") + ) + (1 Sidechain + (A C smiles "Br") + (A C smarts "Br") + (A I join (7 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_C.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_C.rxn new file mode 100644 index 00000000..7e6c48ea --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_C.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 7 position + + (A C Comment "Metabolism.Biaryl_-_protect_7_position_C") + (0 Scaffold + (A C smarts "[cD3]1aaaa2aa[cD2]aa12") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (7 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_Cl.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_Cl.rxn new file mode 100644 index 00000000..49393f49 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_Cl.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 7 position + + (A C Comment "Metabolism.Biaryl_-_protect_7_position_Cl") + (0 Scaffold + (A C smarts "[cD3]1aaaa2aa[cD2]aa12") + ) + (1 Sidechain + (A C smiles "Cl") + (A C smarts "Cl") + (A I join (7 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_F.rxn b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_F.rxn new file mode 100644 index 00000000..e8fa46f2 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Biaryl_-_protect_7_position_F.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1$(c1[c,n][c,n][c,n]2[c,n]([c,n]1)[c,n]([c,n][c,n][c,n]2)*):1]>>[c:1]C Biaryl - protect 7 position + + (A C Comment "Metabolism.Biaryl_-_protect_7_position_F") + (0 Scaffold + (A C smarts "[cD3]1aaaa2aa[cD2]aa12") + ) + (1 Sidechain + (A C smiles "F") + (A C smarts "F") + (A I join (7 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol.rxn b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol.rxn new file mode 100644 index 00000000..cc436ef3 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [cH1:1][cH0:2][OH:3]>>[c:1](Cl)[cH0:2][OH:3] Block ortho to a phenol + + (A C Comment "Metabolism.Block_ortho_to_a_phenol") + (0 Scaffold + (A C smarts "[OD1]-c([cD2])[cD2]") + ) + (1 Sidechain + (A C smiles "C.C") + (A C smarts "C.C") + (A I join (2 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_C1.rxn b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_C1.rxn new file mode 100644 index 00000000..48e2122c --- /dev/null +++ b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_C1.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1:1][cH0:2][OH:3]>>[c:1](Cl)[cH0:2][OH:3] Block ortho to a phenol + + (A C Comment "Metabolism.Block_ortho_to_a_phenol_C1") + (0 Scaffold + (A C smarts "[OD1]-c[cD2]") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (2 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_C2.rxn b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_C2.rxn new file mode 100644 index 00000000..d7cc569a --- /dev/null +++ b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_C2.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [cH1:1][cH0:2][OH:3]>>[c:1](Cl)[cH0:2][OH:3] Block ortho to a phenol + + (A C Comment "Metabolism.Block_ortho_to_a_phenol_C2") + (0 Scaffold + (A C smarts "[OD1]-c([cD2])[cD2]") + ) + (1 Sidechain + (A C smiles "C.C") + (A C smarts "C.C") + (A I join (2 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_Cl1.rxn b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_Cl1.rxn new file mode 100644 index 00000000..27fa7c8b --- /dev/null +++ b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_Cl1.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1:1][cH0:2][OH:3]>>[c:1](Cl)[cH0:2][OH:3] Block ortho to a phenol + + (A C Comment "Metabolism.Block_ortho_to_a_phenol_Cl1") + (0 Scaffold + (A C smarts "[OD1]-c[cD2]") + ) + (1 Sidechain + (A C smiles "Cl") + (A C smarts "Cl") + (A I join (2 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_Cl2.rxn b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_Cl2.rxn new file mode 100644 index 00000000..b8457dc8 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_Cl2.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [cH1:1][cH0:2][OH:3]>>[c:1](Cl)[cH0:2][OH:3] Block ortho to a phenol + + (A C Comment "Metabolism.Block_ortho_to_a_phenol_Cl2") + (0 Scaffold + (A C smarts "[OD1]-c([cD2])[cD2]") + ) + (1 Sidechain + (A C smiles "Cl.Cl") + (A C smarts "Cl.Cl") + (A I join (2 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_F1.rxn b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_F1.rxn new file mode 100644 index 00000000..2286850d --- /dev/null +++ b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_F1.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1:1][cH0:2][OH:3]>>[c:1](Cl)[cH0:2][OH:3] Block ortho to a phenol + + (A C Comment "Metabolism.Block_ortho_to_a_phenol_F1") + (0 Scaffold + (A C smarts "[OD1]-c[cD2]") + ) + (1 Sidechain + (A C smiles "F") + (A C smarts "F") + (A I join (2 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_F2.rxn b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_F2.rxn new file mode 100644 index 00000000..224fa6c9 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Block_ortho_to_a_phenol_F2.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [cH1:1][cH0:2][OH:3]>>[c:1](Cl)[cH0:2][OH:3] Block ortho to a phenol + + (A C Comment "Metabolism.Block_ortho_to_a_phenol_F2") + (0 Scaffold + (A C smarts "[OD1]-c([cD2])[cD2]") + ) + (1 Sidechain + (A C smiles "F.F") + (A C smarts "F.F") + (A I join (2 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Catechol_T_methylenedioxy.rxn b/data/MedchemWizard/Metabolism.Catechol_T_methylenedioxy.rxn new file mode 100644 index 00000000..f489f2d7 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Catechol_T_methylenedioxy.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [O;H1:3][c:1][c:2][O;H1:4]>>[O:3]1[c:1][c:2][O:4]C1 Catechol -> methylenedioxy + + (A C Comment "Metabolism.Catechol_T_methylenedioxy") + (0 Scaffold + (A C smarts "[OH1]-c:c-[OH]") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0)) + (A I join (3 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OEt_T_OCH2CF3.rxn b/data/MedchemWizard/Metabolism.OEt_T_OCH2CF3.rxn new file mode 100644 index 00000000..67b5ea38 --- /dev/null +++ b/data/MedchemWizard/Metabolism.OEt_T_OCH2CF3.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [O:1][C;H2:2][C;H3:3]>>[O:1][C:2][C:3](F)(F)(F) OEt -> OCH2CF3 + + (A C Comment "Metabolism.OEt_T_OCH2CF3") + (0 Scaffold + (A C smarts "[OD2]-[CD2]-[CD1]") + ) + (1 Sidechain + (A C smiles "F.F.F") + (A C smarts "F.F.F") + (A I join (2 0)) + (A I join (2 1)) + (A I join (2 2)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OEt_T_OcPr.rxn b/data/MedchemWizard/Metabolism.OEt_T_OcPr.rxn new file mode 100644 index 00000000..d12d1ecb --- /dev/null +++ b/data/MedchemWizard/Metabolism.OEt_T_OcPr.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [O:1][C;H2:2][C;H3:3]>>[O:1][C:2]1CC1 OEt -> OcPr + + (A C Comment "Metabolism.OEt_T_OcPr") + (0 Scaffold + (A C smarts "[OD2]-[CD2]-[CD1]") + ) + (1 Sidechain + (A C smiles "C") + (A I join (1 0)) + (A I join (2 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OH_T_OCF3.rxn b/data/MedchemWizard/Metabolism.OH_T_OCF3.rxn new file mode 100644 index 00000000..ba6bb89e --- /dev/null +++ b/data/MedchemWizard/Metabolism.OH_T_OCF3.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [#6:1][#8;H1:2]>>[#6:1][#8:2][#6](F)(F)(F) OH -> OCF3 + + (A C Comment "Metabolism.OH_T_OCF3") + (0 Scaffold + (A C smarts "[#6][#8H1]") + (A I remove_atom 1) + ) + (1 Sidechain + (A C smiles "C(F)(F)F") + (A C smarts "C(F)(F)F") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OH_T_OCH2F.rxn b/data/MedchemWizard/Metabolism.OH_T_OCH2F.rxn new file mode 100644 index 00000000..4634aeb1 --- /dev/null +++ b/data/MedchemWizard/Metabolism.OH_T_OCH2F.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [#6:1][#8;H1:2]>>[#6:1][#8:2][#6](F) OH -> OCH2F + + (A C Comment "Metabolism.OH_T_OCH2F") + (0 Scaffold + (A C smarts "[#6][#8D1]") + ) + (1 Sidechain + (A C smiles "CF") + (A C smarts "CF") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OH_T_OCHF2.rxn b/data/MedchemWizard/Metabolism.OH_T_OCHF2.rxn new file mode 100644 index 00000000..044bac54 --- /dev/null +++ b/data/MedchemWizard/Metabolism.OH_T_OCHF2.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [#6:1][#8;H1:2]>>[#6:1][#8:2][#6](F)(F) OH -> OCHF2 + + (A C Comment "Metabolism.OH_T_OCHF2") + (0 Scaffold + (A C smarts "[#6][#8H1]") + ) + (1 Sidechain + (A C smiles "C(F)F") + (A C smarts "C(F)F") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OH_T_OMe.rxn b/data/MedchemWizard/Metabolism.OH_T_OMe.rxn new file mode 100644 index 00000000..9dea5423 --- /dev/null +++ b/data/MedchemWizard/Metabolism.OH_T_OMe.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Metabolism.OH_T_OMe") + (0 Scaffold + (A C smarts "[#6][#8H1]") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OMe_T_OCF3.rxn b/data/MedchemWizard/Metabolism.OMe_T_OCF3.rxn new file mode 100644 index 00000000..402971a4 --- /dev/null +++ b/data/MedchemWizard/Metabolism.OMe_T_OCF3.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [O:1][C;H3:2]>>[O:1][C:2](F)(F)(F) OMe -> OCF3 + + (A C Comment "Metabolism.OMe_T_OCF3") + (0 Scaffold + (A C smarts "[OD2]-[CD1]") + ) + (1 Sidechain + (A C smiles "F.F.F") + (A C smarts "F.F.F") + (A I join (1 0)) + (A I join (1 1)) + (A I join (1 2)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OMe_T_OCH2F.rxn b/data/MedchemWizard/Metabolism.OMe_T_OCH2F.rxn new file mode 100644 index 00000000..6ae76dc8 --- /dev/null +++ b/data/MedchemWizard/Metabolism.OMe_T_OCH2F.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [O:1][C;H3:2]>>[O:1][C:2](F) OMe -> OCH2F + + (A C Comment "Metabolism.OMe_T_OCH2F") + (0 Scaffold + (A C smarts "[OD2][CD1]") + ) + (1 Sidechain + (A C smiles "F") + (A C smarts "F") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OMe_T_OCHF2.rxn b/data/MedchemWizard/Metabolism.OMe_T_OCHF2.rxn new file mode 100644 index 00000000..af6f0227 --- /dev/null +++ b/data/MedchemWizard/Metabolism.OMe_T_OCHF2.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [O:1][C;H3:2]>>[O:1][C:2](F)(F) OMe -> OCHF2 + + (A C Comment "Metabolism.OMe_T_OCHF2") + (0 Scaffold + (A C smarts "[OD2]-[CD1]") + ) + (1 Sidechain + (A C smiles "F.F") + (A C smarts "F.F") + (A I join (1 0)) + (A I join (1 1)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OMe_T_OEt.rxn b/data/MedchemWizard/Metabolism.OMe_T_OEt.rxn new file mode 100644 index 00000000..a9d18b11 --- /dev/null +++ b/data/MedchemWizard/Metabolism.OMe_T_OEt.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [#7:1][#6;H3:2]>>[#7:1][#6:2][#6] OMe -> OEt + + (A C Comment "Metabolism.OMe_T_OEt") + (0 Scaffold + (A C smarts "[OD2]-[CD1]") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OMe_T_OPr.rxn b/data/MedchemWizard/Metabolism.OMe_T_OPr.rxn new file mode 100644 index 00000000..26789f9c --- /dev/null +++ b/data/MedchemWizard/Metabolism.OMe_T_OPr.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [#7:1][#6;H3:2]>>[#7:1][#6:2][#6][#6] OMe -> OPr + + (A C Comment "Metabolism.OMe_T_OPr") + (0 Scaffold + (A C smarts "[OD2]-[CH>0]") + ) + (1 Sidechain + (A C smiles "CC") + (A C smarts "CC") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OMe_T_OcPr.rxn b/data/MedchemWizard/Metabolism.OMe_T_OcPr.rxn new file mode 100644 index 00000000..0faa247f --- /dev/null +++ b/data/MedchemWizard/Metabolism.OMe_T_OcPr.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [O:1][C;H3:2]>>[O:1][C:2]1CC1 OMe -> OcPr + + (A C Comment "Metabolism.OMe_T_OcPr") + (0 Scaffold + (A C smarts "[OD2]-[CD1]") + ) + (1 Sidechain + (A C smiles "CC") + (A C smarts "CC") + (A I join (1 0)) + (A I join (1 1)) + ) +) diff --git a/data/MedchemWizard/Metabolism.OMe_T_OiPr.rxn b/data/MedchemWizard/Metabolism.OMe_T_OiPr.rxn new file mode 100644 index 00000000..b5eac5ce --- /dev/null +++ b/data/MedchemWizard/Metabolism.OMe_T_OiPr.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [#7:1][#6;H3:2]>>[#7:1][#6:2][#6]([#6])([#6]) OMe -> OiPr + + (A C Comment "Metabolism.OMe_T_OiPr") + (0 Scaffold + (A C smarts "[OD2]-[CD1]") + ) + (1 Sidechain + (A C smiles "C(C)C") + (A C smarts "C(C)C") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Phenol_T_hydroxymethyl.rxn b/data/MedchemWizard/Metabolism.Phenol_T_hydroxymethyl.rxn new file mode 100644 index 00000000..8c5da6d5 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Phenol_T_hydroxymethyl.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [cH0:1][OH:2]>>[cH0:1][C:2]O Phenol -> hydroxymethyl + + (A C Comment "Metabolism.Phenol_T_hydroxymethyl") + (0 Scaffold + (A C smarts "[cD3]-[OH]") + (A I break_bond (0 1)) + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0)) + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-Cl.rxn b/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-Cl.rxn new file mode 100644 index 00000000..850f964f --- /dev/null +++ b/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-Cl.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [c:1]1([c;H1:6][c;H1:5][c;H1:4][c;H1:3][c;H1:2]1)[*:7]>>[c:1]1([c;H1:6][c;H1:5][c:4](Cl)[c;H1:3][c;H1:2]1)[*:7] Unsubstituted aryl -> 4-Cl + + (A C Comment "Metabolism.Unsubstituted_aryl_T_4-Cl") + (0 Scaffold + (A C smarts "[cD2]1:[cD2]:[cD2]:[cD3]:[cD2]:[cD2]1") + ) + (1 Sidechain + (A C smiles "Cl") + (A C smarts "Cl") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-F.rxn b/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-F.rxn new file mode 100644 index 00000000..a86193e3 --- /dev/null +++ b/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-F.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [c:1]1([c;H1:6][c;H1:5][c;H1:4][c;H1:3][c;H1:2]1)[*:7]>>[c:1]1([c;H1:6][c;H1:5][c:4](F)[c;H1:3][c;H1:2]1)[*:7] Unsubstituted aryl -> 4-F + + (A C Comment "Metabolism.Unsubstituted_aryl_T_4-F") + (0 Scaffold + (A C smarts "[cD2]1:[cD2]:[cD2]:[cD3]:[cD2]:[cD2]1") + ) + (1 Sidechain + (A C smiles "F") + (A C smarts "F") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-Me.rxn b/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-Me.rxn new file mode 100644 index 00000000..c81d51cb --- /dev/null +++ b/data/MedchemWizard/Metabolism.Unsubstituted_aryl_T_4-Me.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [c:1]1([c;H1:6][c;H1:5][c;H1:4][c;H1:3][c;H1:2]1)[*:7]>>[c:1]1([c;H1:6][c;H1:5][c:4](C)[c;H1:3][c;H1:2]1)[*:7] Unsubstituted aryl -> 4-Me + + (A C Comment "Metabolism.Unsubstituted_aryl_T_4-Me") + (0 Scaffold + (A C smarts "[cD2]1:[cD2]:[cD2]:[cD3]:[cD2]:[cD2]1") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.acetylene_T_ether.rxn b/data/MedchemWizard/Metabolism.acetylene_T_ether.rxn new file mode 100644 index 00000000..1cc74fbd --- /dev/null +++ b/data/MedchemWizard/Metabolism.acetylene_T_ether.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [#6:1]C#C[#6:2]>>[#6:1]OC[#6:2] acetylene --> ether + + (A C Comment "Metabolism.acetylene_T_ether") + (0 Scaffold + (A C smarts "[#6]C#C[#6]") + (A I single_bond (1 2)) + (A C change_element "1 O") + ) +) diff --git a/data/MedchemWizard/Metabolism.alkene_T_alkane.rxn b/data/MedchemWizard/Metabolism.alkene_T_alkane.rxn new file mode 100644 index 00000000..d8f87c79 --- /dev/null +++ b/data/MedchemWizard/Metabolism.alkene_T_alkane.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [#6:1]C#C[#6:2]>>[#6:1]CC[#6:2] alkene --> alkane + + (A C Comment "Metabolism.alkene_T_alkane") + (0 Scaffold + (A C smarts "[#6]C#C[#6]") + (A I single_bond (1 2)) + ) +) diff --git a/data/MedchemWizard/Metabolism.alkene_T_cyclopropyl.rxn b/data/MedchemWizard/Metabolism.alkene_T_cyclopropyl.rxn new file mode 100644 index 00000000..90fdbec1 --- /dev/null +++ b/data/MedchemWizard/Metabolism.alkene_T_cyclopropyl.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [#6:1]C=C[#6:2]>>[#6:1]C1C([#6:2])C1 alkene --> cyclopropyl + + (A C Comment "Metabolism.alkene_T_cyclopropyl") + (0 Scaffold + (A C smarts "[#6]C=C[#6]") + (A I single_bond (1 2)) + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (1 0)) + (A I join (2 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.alkene_T_ether.rxn b/data/MedchemWizard/Metabolism.alkene_T_ether.rxn new file mode 100644 index 00000000..0fa6c339 --- /dev/null +++ b/data/MedchemWizard/Metabolism.alkene_T_ether.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [#6:1]C=C[#6:2]>>[#6:1]OC[#6:2] alkene --> ether + + (A C Comment "Metabolism.alkene_T_ether") + (0 Scaffold + (A C smarts "[#6][CD2]=C[#6]") + (A I single_bond (1 2)) + (A C change_element "1 O") + ) +) diff --git a/data/MedchemWizard/Metabolism.methyl_T_hydroxymethyl.rxn b/data/MedchemWizard/Metabolism.methyl_T_hydroxymethyl.rxn new file mode 100644 index 00000000..019c4dec --- /dev/null +++ b/data/MedchemWizard/Metabolism.methyl_T_hydroxymethyl.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [C;H3:1]>>[C:1]O methyl -> hydroxymethyl + + (A C Comment "Metabolism.methyl_T_hydroxymethyl") + (0 Scaffold + (A C smarts "[CH3]") + ) + (1 Sidechain + (A C smiles "O") + (A C smarts "O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.pyridyl_T_2-6-dimethylpyridyl.rxn b/data/MedchemWizard/Metabolism.pyridyl_T_2-6-dimethylpyridyl.rxn new file mode 100644 index 00000000..70e8914b --- /dev/null +++ b/data/MedchemWizard/Metabolism.pyridyl_T_2-6-dimethylpyridyl.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [cH1:1]1[n:2][c;H1:3][c:4][c:5][c:6]1>>[c:1]1([c:6][c:5][c:4][c:3]([n:2]1)C)C pyridyl -> 2,6-dimethylpyridyl + + (A C Comment "Metabolism.pyridyl_T_2-6-dimethylpyridyl") + (0 Scaffold + (A C smarts "[cH1]1n[cH1]ccc1") + ) + (1 Sidechain + (A C smiles "C.C") + (A C smarts "C.C") + (A I join (0 0)) + (A I join (2 1)) + ) +) diff --git a/data/MedchemWizard/Metabolism.pyridyl_T_2-methyl_pyridyl.rxn b/data/MedchemWizard/Metabolism.pyridyl_T_2-methyl_pyridyl.rxn new file mode 100644 index 00000000..39c4dde1 --- /dev/null +++ b/data/MedchemWizard/Metabolism.pyridyl_T_2-methyl_pyridyl.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [cH1:1]1[n:2][c;H1:3][c:4][c:5][c:6]1>>[cH1:1]1[n:2][c:3](C)[c:4][c:5][c:6]1 pyridyl -> 2-methyl pyridyl + + (A C Comment "Metabolism.pyridyl_T_2-methyl_pyridyl") + (0 Scaffold + (A C smarts "[cH1]1[n][cH1][c][c][c]1") + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Metabolism.pyridyl_T_N-oxide.rxn b/data/MedchemWizard/Metabolism.pyridyl_T_N-oxide.rxn new file mode 100644 index 00000000..99d5f993 --- /dev/null +++ b/data/MedchemWizard/Metabolism.pyridyl_T_N-oxide.rxn @@ -0,0 +1,12 @@ +(0 Reaction +# [cH1:1]1[n:2][c;H1:3][c:4][c:5][c:6]1>>[cH1:1]1[n;+1:2]([#8;-1])[c:3][c:4][c:5][c:6]1 pyridyl -> N-oxide + + (A C Comment "Metabolism.pyridyl_T_N-oxide") + (0 Scaffold + (A C smarts "[cH1]1[n][cH1][c][c][c]1") + ) + (1 Sidechain + (A C smiles "[cH1:1]1[n;+1:2]([#8;-1])[c:3][c:4][c:5][c:6]1 MET.pyridyl_T_N-oxide") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.1-4-phenyl_T_2.2.2_tricycle.rxn b/data/MedchemWizard/More_aryl_rings.1-4-phenyl_T_2.2.2_tricycle.rxn new file mode 100644 index 00000000..7071cd86 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.1-4-phenyl_T_2.2.2_tricycle.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# c1(ccc(cc1)[*:1])[*:2]>>[*:1]C21CC(C1)(C2)[*:2] "1,4-pheny; --> 2.2.2 tricycle" + + (A C Comment "More_aryl_rings.1-4-phenyl_T_2.2.2_tricycle") + (0 Scaffold + (A C smarts "c1(ccc(cc1)[*:1])[*:2]") + ) + (1 Sidechain + (A C smiles "[*:1]C21CC(C1)(C2)[*:2] ARGA.1-4-pheny;_T_2.2.2_tricycle") + (A C smarts "[*:1]C21CC(C1)(C2)[*:2]") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.aryl_C_T_aryl_N.rxn b/data/MedchemWizard/More_aryl_rings.aryl_C_T_aryl_N.rxn new file mode 100644 index 00000000..b29f2382 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.aryl_C_T_aryl_N.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [c;!$(c=[#8]):1]>>[n:1] aryl C --> aryl N + + (A C Comment "More_aryl_rings.aryl_C_T_aryl_N") + (0 Scaffold + (A C smarts "[cD2]") + (A C change_element "0 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.aryl_n_T_aryl_c.rxn b/data/MedchemWizard/More_aryl_rings.aryl_n_T_aryl_c.rxn new file mode 100644 index 00000000..7bbf8d46 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.aryl_n_T_aryl_c.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [n;H0:1]>>[c:1] aryl n --> aryl c + + (A C Comment "More_aryl_rings.aryl_n_T_aryl_c") + (0 Scaffold + (A C smarts "[nH0+0]") + (A C change_element "0 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.ccn_T_ncc.rxn b/data/MedchemWizard/More_aryl_rings.ccn_T_ncc.rxn new file mode 100644 index 00000000..464937e9 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.ccn_T_ncc.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [c:1][c:2][n:3]>>[n:1][c:2][c:3] ccn --> ncc + + (A C Comment "More_aryl_rings.ccn_T_ncc") + (0 Scaffold + (A C smarts "[/IWrid1cD2]:c:[/IWrid1nR1+0]") + (A C change_element "0 N") + (A C change_element "2 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.cn_T_nc.rxn b/data/MedchemWizard/More_aryl_rings.cn_T_nc.rxn new file mode 100644 index 00000000..0afaff17 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.cn_T_nc.rxn @@ -0,0 +1,12 @@ +(0 Reaction +# [c:1][n:2]>>[n:1][c:2] cn --> nc + + (A C Comment "More_aryl_rings.cn_T_nc") + (0 Scaffold +# (A C smarts "[c]:[n]") +# IAW making this more restrictive + (A C smarts "[cD2]:[nR1+0]") + (A C change_element "0 N") + (A C change_element "1 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.cn_T_nn.rxn b/data/MedchemWizard/More_aryl_rings.cn_T_nn.rxn new file mode 100644 index 00000000..3926a868 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.cn_T_nn.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [c:1][n:2]>>[n:1][n:2] cn --> nn + + (A C Comment "More_aryl_rings.cn_T_nn") + (0 Scaffold + (A C smarts "[cD2]:[n+0]") + (A C change_element "0 N") + (A C change_element "1 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.furan_T_phenyl.rxn b/data/MedchemWizard/More_aryl_rings.furan_T_phenyl.rxn new file mode 100644 index 00000000..ae5fe3dc --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.furan_T_phenyl.rxn @@ -0,0 +1,20 @@ +(0 Reaction +# [c:1]o[c:2]>>[c:1]cc[c:2] furan --> phenyl + + (A C Comment "More_aryl_rings.furan_T_phenyl") + (0 Scaffold + (A C smarts "o1[cR1][cR1][cR1]c1") + (A I break_bond (0 1)) + (A C change_element "0 C") + (A I single_bond (1 2)) + (A I double_bond (2 3)) + (A I single_bond (3 4)) + (A I double_bond (4 0)) + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0 1)) + (A I join (1 0 2)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.indole_T_indazole.rxn b/data/MedchemWizard/More_aryl_rings.indole_T_indazole.rxn new file mode 100644 index 00000000..7833014d --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.indole_T_indazole.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [c:1][n$(n1c2c(cc1)cccc2):2][c:3]>>[c:1][n:2][n:3] indole --> indazole + + (A C Comment "More_aryl_rings.indole_T_indazole") + (0 Scaffold + (A C smarts "n1[cR1D2]cc2ccccc12") + (A C change_element "1 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.indole_T_indolizine.rxn b/data/MedchemWizard/More_aryl_rings.indole_T_indolizine.rxn new file mode 100644 index 00000000..65bca783 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.indole_T_indolizine.rxn @@ -0,0 +1,19 @@ +(0 Reaction +# [c:1][n$(n1ccc2c1cccc2):2]>>[n:1][c:2] indole --> indolizine + + (A C Comment "More_aryl_rings.indole_T_indolizine") + (0 Scaffold + (A C smarts "n1[cR1]cc2ccccc12") + (A C change_element "0 C") + (A C change_element "8 N") + (A I double_bond (0 1)) + (A I single_bond (1 2)) + (A I double_bond (2 3)) + (A I single_bond (3 4)) + (A I double_bond (4 5)) + (A I single_bond (5 6)) + (A I double_bond (6 7)) + (A I single_bond (7 8)) + (A I single_bond (3 8)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nH_T_O.rxn b/data/MedchemWizard/More_aryl_rings.nH_T_O.rxn new file mode 100644 index 00000000..313de090 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nH_T_O.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [n;H1:1]>>[o:1] nH --> O + + (A C Comment "More_aryl_rings.nH_T_O") + (0 Scaffold + (A C smarts "[nH1]") + (A C change_element "0 O") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nH_T_s.rxn b/data/MedchemWizard/More_aryl_rings.nH_T_s.rxn new file mode 100644 index 00000000..9eebc0c0 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nH_T_s.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [n;H1:1]>>[s:1] nH --> s + + (A C Comment "More_aryl_rings.nH_T_s") + (0 Scaffold + (A C smarts "[nH1]") + (A C change_element "0 S") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.ncc_T_ncn.rxn b/data/MedchemWizard/More_aryl_rings.ncc_T_ncn.rxn new file mode 100644 index 00000000..3a19965a --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.ncc_T_ncn.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [n:1][c:2][c:3]>>[n:1][c:2][n:3] ncc --> ncn + + (A C Comment "More_aryl_rings.ncc_T_ncn") + (0 Scaffold + (A C smarts "[n][c][cD2]") + (A C change_element "2 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.ncc_T_nnc.rxn b/data/MedchemWizard/More_aryl_rings.ncc_T_nnc.rxn new file mode 100644 index 00000000..527bed55 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.ncc_T_nnc.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [n:1][c:2][c:3]>>[n:1][n:2][c:3] ncc --> nnc + + (A C Comment "More_aryl_rings.ncc_T_nnc") + (0 Scaffold + (A C smarts "[/IWrid1nD2]:[cD2]:[/IWrid1c]") + (A C change_element "1 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nccn_T_ncccn.rxn b/data/MedchemWizard/More_aryl_rings.nccn_T_ncccn.rxn new file mode 100644 index 00000000..70fc0892 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nccn_T_ncccn.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [n;r5;R1;H1:1][c:2][c:3][n:4]>>[n:1][c:2]c[c:3][n:4] nccn --> ncccn + + (A C Comment "More_aryl_rings.nccn_T_ncccn") + (0 Scaffold +# (A C smarts "[n;r5;R1;H1:1][c:2][c:3][n:4]") + (A C smarts "[nR1H]1:c:[cR1]:n:c1") + (A I break_bond (0 1)) + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0 2)) + (A I join (1 0 1)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nccn_T_ncnc.rxn b/data/MedchemWizard/More_aryl_rings.nccn_T_ncnc.rxn new file mode 100644 index 00000000..cf5cb6f0 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nccn_T_ncnc.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [n:1][c:2][c:3][n:4]>>[n:1][c:2][n:3][c:4] nccn --> ncnc + + (A C Comment "More_aryl_rings.nccn_T_ncnc") + (0 Scaffold + (A C smarts "[n][c]:[cD2]:[nD2]") + (A C change_element "2 N") + (A C change_element "3 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.ncn_T_nccn.rxn b/data/MedchemWizard/More_aryl_rings.ncn_T_nccn.rxn new file mode 100644 index 00000000..5faff8bc --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.ncn_T_nccn.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [n;r5;R1;H1:1][c:2][n:3]>>[n:1][c:2]c[n:3] ncn --> nccn +# should run without unique embeddings + + (A C Comment "More_aryl_rings.ncn_T_nccn") + (0 Scaffold + (A C smarts "[nR1H]1:c:[nR1]:[aR1]:[aR1]1") + (A I break_bond (0 1)) + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0 2)) + (A I join (1 0 1)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nn_T_ncn.rxn b/data/MedchemWizard/More_aryl_rings.nn_T_ncn.rxn new file mode 100644 index 00000000..3ce71654 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nn_T_ncn.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [n;r5;R1;H1:1][n:2]>>[n:1]c[n:2] nn --> ncn + + (A C Comment "More_aryl_rings.nn_T_ncn") + (0 Scaffold + (A C smarts "[nR1H]1:[nR1]:[aR1]:[aR1]:[aR1]1") + (A I break_bond (0 1)) + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0 2)) + (A I join (1 0 1)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nnnc_T_nncn.rxn b/data/MedchemWizard/More_aryl_rings.nnnc_T_nncn.rxn new file mode 100644 index 00000000..30da7649 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nnnc_T_nncn.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [n:1][n:2][n:3][c:4]>>[n:1][n:2][c:3][n:4] nnnc --> nncn + + (A C Comment "More_aryl_rings.nnnc_T_nncn") + (0 Scaffold + (A C smarts "nnn[cD2]") + (A C change_element "2 C") + (A C change_element "3 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nocn_T_nonc.rxn b/data/MedchemWizard/More_aryl_rings.nocn_T_nonc.rxn new file mode 100644 index 00000000..7afdc8ce --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nocn_T_nonc.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [n:1][o:2][c:3][n:4]>>[n:1][o:2][n:3][c:4] nocn --> nonc + + (A C Comment "More_aryl_rings.nocn_T_nonc") + (0 Scaffold + (A C smarts "no[cD2][nD3]") + (A C change_element "2 N") + (A C change_element "3 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nonc_T_nocn.rxn b/data/MedchemWizard/More_aryl_rings.nonc_T_nocn.rxn new file mode 100644 index 00000000..0d69bd8f --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nonc_T_nocn.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [n:1][o:2][n:3][c:4]>>[n:1][o:2][c:3][n:4] nonc --> nocn + + (A C Comment "More_aryl_rings.nonc_T_nocn") + (0 Scaffold + (A C smarts "non[cD2]") + (A C change_element "2 C") + (A C change_element "3 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.nscn_T_nsnc.rxn b/data/MedchemWizard/More_aryl_rings.nscn_T_nsnc.rxn new file mode 100644 index 00000000..4108938c --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.nscn_T_nsnc.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [n:1][s:2][c:3][n:4]>>[n:1][s:2][n:3][c:4] nscn --> nsnc + + (A C Comment "More_aryl_rings.nscn_T_nsnc") + (0 Scaffold + (A C smarts "ns[cD2][nD3]") + (A C change_element "2 N") + (A C change_element "3 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.o_T_NH.rxn b/data/MedchemWizard/More_aryl_rings.o_T_NH.rxn new file mode 100644 index 00000000..9d171931 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.o_T_NH.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [o:1]>>[n:1] o --> NH + + (A C Comment "More_aryl_rings.o_T_NH") + (0 Scaffold + (A C smarts "o") + (A C change_element "0 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.o_T_s.rxn b/data/MedchemWizard/More_aryl_rings.o_T_s.rxn new file mode 100644 index 00000000..d1639c85 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.o_T_s.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [o:1]>>[s:1] o --> s + + (A C Comment "More_aryl_rings.o_T_s") + (0 Scaffold + (A C smarts "o") + (A C change_element "0 S") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.ocn_T_onc.rxn b/data/MedchemWizard/More_aryl_rings.ocn_T_onc.rxn new file mode 100644 index 00000000..e3c4a666 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.ocn_T_onc.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [o:1][c:2][n:3]>>[o:1][n:2][c:3] ocn --> onc + + (A C Comment "More_aryl_rings.ocn_T_onc") + (0 Scaffold + (A C smarts "o:[cD2]:n") + (A C change_element "1 N") + (A C change_element "2 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.onc_T_ocn.rxn b/data/MedchemWizard/More_aryl_rings.onc_T_ocn.rxn new file mode 100644 index 00000000..182ac82b --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.onc_T_ocn.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [o:1][n:2][c:3]>>[o:1][c:2][n:3] onc --> ocn + + (A C Comment "More_aryl_rings.onc_T_ocn") + (0 Scaffold + (A C smarts "o:n:[cD2]") + (A C change_element "1 C") + (A C change_element "2 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_--_isoquinolinyl.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_--_isoquinolinyl.rxn new file mode 100644 index 00000000..d9accf3b --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_--_isoquinolinyl.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)ccnc2 phenyl -- isoquinolinyl + + (A C Comment "More_aryl_rings.phenyl_--_isoquinolinyl") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "C=NC=C") + (A C smarts "C=NC=C") + (A I join (0 0)) + (A I join (1 3)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_benzimidazole.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_benzimidazole.rxn new file mode 100644 index 00000000..9f93e187 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_benzimidazole.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)ncn2 phenyl --> benzimidazole + + (A C Comment "More_aryl_rings.phenyl_T_benzimidazole") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "N=CN") + (A C smarts "N=CN") + (A I join (0 0)) + (A I join (1 2)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_cinnoline.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_cinnoline.rxn new file mode 100644 index 00000000..ed04314d --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_cinnoline.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)nncc2 phenyl --> cinnoline + + (A C Comment "More_aryl_rings.phenyl_T_cinnoline") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "N=NC=C") + (A C smarts "N=NC=C") + (A I join (0 0)) + (A I join (1 3)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_furan.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_furan.rxn new file mode 100644 index 00000000..81f69df0 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_furan.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [c$(c1ccc[c:2]c1)H1:1][cH1][c:2]>>[o:1][c:2] phenyl --> furan + + (A C Comment "More_aryl_rings.phenyl_T_furan") + (0 Scaffold + (A C smarts "[/IWfss1cD2]1[cD2]cccc1") + (A C change_element "0 O") + (A I remove_atom 1) + (A I single_bond (0 2)) + (A I double_bond (2 3)) + (A I single_bond (3 4)) + (A I double_bond (4 5)) + (A I single_bond (5 0)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_indole.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_indole.rxn new file mode 100644 index 00000000..4da15299 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_indole.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)ncc2 phenyl --> indole + + (A C Comment "More_aryl_rings.phenyl_T_indole") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "N=CC") + (A C smarts "N=CC") + (A I join (0 0)) + (A I join (1 2)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_naphthyl.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_naphthyl.rxn new file mode 100644 index 00000000..376b1c78 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_naphthyl.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)cccc2 phenyl --> naphthyl + + (A C Comment "More_aryl_rings.phenyl_T_naphthyl") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "C=CC=C") + (A C smarts "C=CC=C") + (A I join (0 0)) + (A I join (1 3)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_phthalazine.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_phthalazine.rxn new file mode 100644 index 00000000..b2325477 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_phthalazine.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)cnnc2 phenyl --> phthalazine + + (A C Comment "More_aryl_rings.phenyl_T_phthalazine") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "C=NN=C") + (A C smarts "C=NN=C") + (A I join (0 0)) + (A I join (1 3)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_quinazoline.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_quinazoline.rxn new file mode 100644 index 00000000..9eb931b3 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_quinazoline.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)ncnc2 phenyl --> quinazoline + + (A C Comment "More_aryl_rings.phenyl_T_quinazoline") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "N=CN=C") + (A C smarts "N=CN=C") + (A I join (0 0)) + (A I join (1 3)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_quinolinyl.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_quinolinyl.rxn new file mode 100644 index 00000000..ef2db694 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_quinolinyl.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)nccc2 phenyl --> quinolinyl + + (A C Comment "More_aryl_rings.phenyl_T_quinolinyl") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "N=CC=C") + (A C smarts "N=CC=C") + (A I join (0 0)) + (A I join (1 3)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_quinoxaline.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_quinoxaline.rxn new file mode 100644 index 00000000..83f9ec22 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_quinoxaline.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;R1:6]1[a;R1:5][a;H1;R1:4][a;H1;R1:3][a;R1:2][a;R1:1]1>>[a;R1:6]1[a;R1:1][a;R1:2][c:3]2[c:4]([a;R1:5]1)nccn2 phenyl --> quinoxaline + + (A C Comment "More_aryl_rings.phenyl_T_quinoxaline") + (0 Scaffold + (A C smarts "[/IWfss1/IWKl1cD2]1:[cD2]:c:c:c:c1") + (A I toggle_kekule_form (0 1 1)) + ) + (1 Sidechain + (A C smiles "N=CC=N") + (A C smarts "N=CC=N") + (A I join (0 0)) + (A I join (1 3)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.phenyl_T_thiophene.rxn b/data/MedchemWizard/More_aryl_rings.phenyl_T_thiophene.rxn new file mode 100644 index 00000000..87499d4f --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.phenyl_T_thiophene.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [c$(c1ccc[c:2]c1)H1:1][cH1][c:2]>>[s:1][c:2] phenyl --> thiophene + + (A C Comment "More_aryl_rings.phenyl_T_thiophene") + (0 Scaffold + (A C smarts "[/IWfss1cD2]1[cD2]cccc1") + (A C change_element "0 S") + (A I remove_atom 1) + (A I single_bond (0 2)) + (A I double_bond (2 3)) + (A I single_bond (3 4)) + (A I double_bond (4 5)) + (A I single_bond (5 0)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.pyrrole_T_indole.rxn b/data/MedchemWizard/More_aryl_rings.pyrrole_T_indole.rxn new file mode 100644 index 00000000..4607c0d0 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.pyrrole_T_indole.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [a;H1;R1:5]1[a;H1;R1:4][a;R1:3][a;R1:2][n;R1:1]1>>[c:5]21[n;R1:1][a;R1:2][a;R1:3][c:4]1cccc2 pyrrole --> indole + + (A C Comment "More_aryl_rings.pyrrole_T_indole") + (0 Scaffold + (A C smarts "[/IWfss1nH]1:a:[aH]:[aH]:a1") + ) + (1 Sidechain + (A C smiles "C=CC=C") + (A C smarts "C=CC=C") + (A I join (2 0)) + (A I join (3 3)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.pyrrole_T_isoindole.rxn b/data/MedchemWizard/More_aryl_rings.pyrrole_T_isoindole.rxn new file mode 100644 index 00000000..30f33e9d --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.pyrrole_T_isoindole.rxn @@ -0,0 +1,13 @@ +(0 Reaction +# [a;RH1;1:5]1[a;H1;R1:4][a;R1:3][a;R1:2][n;R1:1]1>>[a;R1:5]1[n;R1:1][a;R1:2][c:3]2[c:4]1cccc2 pyrrole --> isoindole + + (A C Comment "More_aryl_rings.pyrrole_T_isoindole") + (0 Scaffold + (A C smarts "[a;RH1;1:5]1[a;H1;R1:4][a;R1:3][a;R1:2][n;R1:1]1") + ) + (1 Sidechain + (A C smiles "[a;R1:5]1[n;R1:1][a;R1:2][c:3]2[c:4]1cccc2 ARGA.pyrrole_T_isoindole") + (A C smarts "[a;R1:5]1[n;R1:1][a;R1:2][c:3]2[c:4]1cccc2") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.pyrrole_T_phenyl.rxn b/data/MedchemWizard/More_aryl_rings.pyrrole_T_phenyl.rxn new file mode 100644 index 00000000..13ce2399 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.pyrrole_T_phenyl.rxn @@ -0,0 +1,20 @@ +(0 Reaction +# [c:1][n;H1][c:2]>>[c:1]cc[c:2] pyrrole --> phenyl + + (A C Comment "More_aryl_rings.pyrrole_T_phenyl") + (0 Scaffold + (A C smarts "[nH]1[cR1][cR1][cR1]c1") + (A I break_bond (0 1)) + (A C change_element "0 C") + (A I single_bond (1 2)) + (A I double_bond (2 3)) + (A I single_bond (3 4)) + (A I double_bond (4 0)) + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0 1)) + (A I join (1 0 2)) + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.s_T_NH.rxn b/data/MedchemWizard/More_aryl_rings.s_T_NH.rxn new file mode 100644 index 00000000..64a03c2a --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.s_T_NH.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [s:1]>>[n:1] s --> NH + + (A C Comment "More_aryl_rings.s_T_NH") + (0 Scaffold + (A C smarts "s") + (A C change_element "0 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.s_T_o.rxn b/data/MedchemWizard/More_aryl_rings.s_T_o.rxn new file mode 100644 index 00000000..e312f87d --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.s_T_o.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [s:1]>>[o:1] s --> o + + (A C Comment "More_aryl_rings.s_T_o") + (0 Scaffold + (A C smarts "[s]") + (A C change_element "0 O") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.scn_T_snc.rxn b/data/MedchemWizard/More_aryl_rings.scn_T_snc.rxn new file mode 100644 index 00000000..b5757066 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.scn_T_snc.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [s:1][c:2][n:3]>>[s:1][n:2][c:3] scn --> snc + + (A C Comment "More_aryl_rings.scn_T_snc") + (0 Scaffold + (A C smarts "s:[cD2]:n") + (A C change_element "1 N") + (A C change_element "2 C") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.snc_T_scn.rxn b/data/MedchemWizard/More_aryl_rings.snc_T_scn.rxn new file mode 100644 index 00000000..eb2eefff --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.snc_T_scn.rxn @@ -0,0 +1,10 @@ +(0 Reaction +# [s:1][n:2][c:3]>>[s:1][c:2][n:3] snc --> scn + + (A C Comment "More_aryl_rings.snc_T_scn") + (0 Scaffold + (A C smarts "s:n:[cD2]") + (A C change_element "1 C") + (A C change_element "2 N") + ) +) diff --git a/data/MedchemWizard/More_aryl_rings.thiophene_T_phenyl.rxn b/data/MedchemWizard/More_aryl_rings.thiophene_T_phenyl.rxn new file mode 100644 index 00000000..96a5b1b3 --- /dev/null +++ b/data/MedchemWizard/More_aryl_rings.thiophene_T_phenyl.rxn @@ -0,0 +1,20 @@ +(0 Reaction +# [c:1]s[c:2]>>[c:1]cc[c:2] thiophene --> phenyl + + (A C Comment "More_aryl_rings.thiophene_T_phenyl") + (0 Scaffold + (A C smarts "s1[cR1][cR1][cR1]c1") + (A I break_bond (0 1)) + (A C change_element "0 C") + (A I single_bond (1 2)) + (A I double_bond (2 3)) + (A I single_bond (3 4)) + (A I double_bond (4 0)) + ) + (1 Sidechain + (A C smiles "C") + (A C smarts "C") + (A I join (0 0 1)) + (A I join (1 0 2)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.N-Me_urea.rxn b/data/MedchemWizard/Phenol_isosteres.N-Me_urea.rxn new file mode 100644 index 00000000..1dd13197 --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.N-Me_urea.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]C(=O)NC)[a:3] N-Me urea + + (A C Comment "Phenol_isosteres.N-Me_urea") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NC(=O)NC") + (A C smarts "NC(=O)NC") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.Urea.rxn b/data/MedchemWizard/Phenol_isosteres.Urea.rxn new file mode 100644 index 00000000..659de74d --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.Urea.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]C(=O)N)[a:3] Urea + + (A C Comment "Phenol_isosteres.Urea") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NC(=O)N") + (A C smarts "NC(=O)N") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.acetamide.rxn b/data/MedchemWizard/Phenol_isosteres.acetamide.rxn new file mode 100644 index 00000000..43b666d3 --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.acetamide.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]C(=O)C)[a:3] acetamide + + (A C Comment "Phenol_isosteres.acetamide") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NC(=O)C") + (A C smarts "NC(=O)C") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.benzimidazole.rxn b/data/MedchemWizard/Phenol_isosteres.benzimidazole.rxn new file mode 100644 index 00000000..f1588744 --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.benzimidazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]C=N[a:3]1 benzimidazole + + (A C Comment "Phenol_isosteres.benzimidazole") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NC=N") + (A C smarts "NC=N") + (A I join (1 0)) + (A I join (2 2 1)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.benzotriazole.rxn b/data/MedchemWizard/Phenol_isosteres.benzotriazole.rxn new file mode 100644 index 00000000..3fd4c6e3 --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.benzotriazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]N=N[a:3]1 benzotriazole + + (A C Comment "Phenol_isosteres.benzotriazole") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NN=N") + (A C smarts "NN=N") + (A I join (1 0)) + (A I join (2 2 1)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.hydroxymethyl.rxn b/data/MedchemWizard/Phenol_isosteres.hydroxymethyl.rxn new file mode 100644 index 00000000..45ae7173 --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.hydroxymethyl.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([a;H1:3])C[#8;H1:1] hydroxymethyl + + (A C Comment "Phenol_isosteres.hydroxymethyl") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "CO") + (A C smarts "CO") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.imidazolone.rxn b/data/MedchemWizard/Phenol_isosteres.imidazolone.rxn new file mode 100644 index 00000000..d9b9f91c --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.imidazolone.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]C(N[a:3]1)=O imidazolone + + (A C Comment "Phenol_isosteres.imidazolone") + (0 Scaffold + (A C smarts "[OD1]-[/IWKl1ar6]:[aH]") + (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NC(=O)N") + (A C smarts "NC(=O)N") + (A I join (1 0)) + (A I join (2 3 1)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.indazole.rxn b/data/MedchemWizard/Phenol_isosteres.indazole.rxn new file mode 100644 index 00000000..bb53c303 --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.indazole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]N=C[a:3]1 indazole + + (A C Comment "Phenol_isosteres.indazole") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NN=C") + (A C smarts "NN=C") + (A I join (1 0)) + (A I join (2 2 1)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.indole.rxn b/data/MedchemWizard/Phenol_isosteres.indole.rxn new file mode 100644 index 00000000..4162d424 --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.indole.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[a:3]C=C[#7H1:1]1 indole + + (A C Comment "Phenol_isosteres.indole") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NC=C") + (A C smarts "NC=C") + (A I join (1 0)) + (A I join (2 2 1)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.isatin.rxn b/data/MedchemWizard/Phenol_isosteres.isatin.rxn new file mode 100644 index 00000000..796c38e7 --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.isatin.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]C(C([a:3]1)=O)=O isatin + + (A C Comment "Phenol_isosteres.isatin") + (0 Scaffold + (A C smarts "[OD1]-[/IWKl1ar6]:[aH]") + (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NC(=O)C=O") + (A C smarts "NC(=O)C=O") + (A I join (1 0)) + (A I join (2 3)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.oxindole.rxn b/data/MedchemWizard/Phenol_isosteres.oxindole.rxn new file mode 100644 index 00000000..3af762dc --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.oxindole.rxn @@ -0,0 +1,17 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]1[#7H1:1]C(C[a:3]1)=O oxindole + + (A C Comment "Phenol_isosteres.oxindole") + (0 Scaffold + (A C smarts "[OD1]-[/IWKl1ar6]:[aH]") + (A I toggle_kekule_form (1 2 2)) + (A I remove_atom 0) + (A I single_bond (1 2)) + ) + (1 Sidechain + (A C smiles "NC(=O)C") + (A C smarts "NC(=O)C") + (A I join (1 0 2)) + (A I join (2 3 2)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.sulfamide.rxn b/data/MedchemWizard/Phenol_isosteres.sulfamide.rxn new file mode 100644 index 00000000..388f3bbd --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.sulfamide.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]S(=O)(N)=O)[a:3] sulfamide + + (A C Comment "Phenol_isosteres.sulfamide") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NS(=O)(=O)N") + (A C smarts "NS(=O)(=O)N") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/Phenol_isosteres.sulfonamide.rxn b/data/MedchemWizard/Phenol_isosteres.sulfonamide.rxn new file mode 100644 index 00000000..2abf620e --- /dev/null +++ b/data/MedchemWizard/Phenol_isosteres.sulfonamide.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a:2]([a;H1:3])[#8;H1:1]>>[a:2]([#7H1:1]S(=O)(C)=O)[a:3] sulfonamide + + (A C Comment "Phenol_isosteres.sulfonamide") + (0 Scaffold + (A C smarts "[OD1]-[ar6]:[aH]") +# (A I toggle_kekule_form (1 2 1)) + (A I remove_atom 0) + ) + (1 Sidechain + (A C smiles "NS(=O)(=O)C") + (A C smarts "NS(=O)(=O)C") + (A I join (1 0)) + ) +) diff --git a/data/MedchemWizard/REACTIONS b/data/MedchemWizard/REACTIONS new file mode 100644 index 00000000..e0d02e84 --- /dev/null +++ b/data/MedchemWizard/REACTIONS @@ -0,0 +1,260 @@ +Acid_isosteres.10.rxn +Acid_isosteres.11.rxn +Acid_isosteres.12.rxn +Acid_isosteres.13.rxn +Acid_isosteres.14.rxn +Acid_isosteres.15.rxn +Acid_isosteres.16.rxn +Acid_isosteres.17.rxn +Acid_isosteres.18.rxn +Acid_isosteres.19.rxn +Acid_isosteres.1.rxn +Acid_isosteres.20.rxn +Acid_isosteres.21.rxn +Acid_isosteres.22.rxn +Acid_isosteres.23.rxn +Acid_isosteres.24.rxn +Acid_isosteres.25.rxn +Acid_isosteres.26.rxn +Acid_isosteres.27.rxn +Acid_isosteres.28.rxn +Acid_isosteres.29.rxn +Acid_isosteres.2.rxn +Acid_isosteres.30.rxn +Acid_isosteres.31.rxn +Acid_isosteres.32.rxn +Acid_isosteres.33.rxn +Acid_isosteres.34.rxn +Acid_isosteres.35.rxn +Acid_isosteres.36.rxn +Acid_isosteres.37.rxn +Acid_isosteres.38.rxn +Acid_isosteres.39.rxn +Acid_isosteres.3.rxn +Acid_isosteres.40.rxn +Acid_isosteres.41.rxn +Acid_isosteres.42.rxn +Acid_isosteres.43.rxn +Acid_isosteres.44.rxn +Acid_isosteres.45.rxn +Acid_isosteres.46.rxn +Acid_isosteres.4.rxn +Acid_isosteres.5.rxn +Acid_isosteres.6.rxn +Acid_isosteres.7.rxn +Acid_isosteres.8.rxn +Acid_isosteres.9.rxn +Acid_isosteres..rxn +Aryl_group_addition.add_2-pyridyl.rxn +Aryl_group_addition.add_3-pyridyl.rxn +Aryl_group_addition.add_4-pyridyl.rxn +Aryl_group_addition.add_benzyl.rxn +Aryl_group_addition.add_phenyl.rxn +Aryl_substituent_Scan.add_acetamido.rxn +Aryl_substituent_Scan.add_Br.rxn +Aryl_substituent_Scan.add_carbamoyl.rxn +Aryl_substituent_Scan.add_carboxylate.rxn +Aryl_substituent_Scan.add_Cl.rxn +Aryl_substituent_Scan.add_ethoxy.rxn +Aryl_substituent_Scan.add_F.rxn +Aryl_substituent_Scan.add_hydroxymethyl.rxn +Aryl_substituent_Scan.add_hydroxy.rxn +Aryl_substituent_Scan.add_Me.rxn +Aryl_substituent_Scan.add_methoxy.rxn +Aryl_substituent_Scan.add_methylketone.rxn +Aryl_substituent_Scan.add_methylsulfone.rxn +Aryl_substituent_Scan.add_methylsulfoxide.rxn +Aryl_substituent_Scan.add_nitrile.rxn +Aryl_substituent_Scan.add_nitrogen.rxn +Aryl_substituent_Scan.add_sulfonamide.rxn +Aryl_substituent_Scan.add_t-butyl.rxn +Aryl_substituent_Scan.add_trifluoromethoxy.rxn +Aryl_substituent_Scan.add_trifluromethyl.rxn +Aryl_substituent_Scan.add_urea.rxn +Ester-amide_isosteres.1-3-4_oxadiazole.rxn +Ester-amide_isosteres.2_pyrazine.rxn +Ester-amide_isosteres.amidine.rxn +Ester-amide_isosteres.amino_1-2-4-oxazole.rxn +Ester-amide_isosteres.amino-1-3-4-_oxazole.rxn +Ester-amide_isosteres.amino_oxazole.rxn +Ester-amide_isosteres.cyano_oxime.rxn +Ester-amide_isosteres.isomeric_amino-1-3-4-_oxazole.rxn +Ester-amide_isosteres.isomeric_reversed_amino-1-3-4-_oxazole.rxn +Ester-amide_isosteres.isoxazole.rxn +Ester-amide_isosteres.pyrazine.rxn +Ester-amide_isosteres.reverse_1-3-4_oxadiazole.rxn +Ester-amide_isosteres.reverse_amidine.rxn +Ester-amide_isosteres.reverse_amino_oxazole.rxn +Ester-amide_isosteres.reverse_cyano_oxime.rxn +Ester-amide_isosteres.reversed_amino-1-2-4-oxazole.rxn +Ester-amide_isosteres.reversed_amino-1-3-4-_oxazole.rxn +Ester-amide_isosteres.reverse_tetrazole.rxn +Ester-amide_isosteres.reverse_triazole.rxn +Ester-amide_isosteres._T_1-2-3_triazole.rxn +Ester-amide_isosteres._T_1-2-4_oxadiazole.rxn +Ester-amide_isosteres._T_1-2-4_triazole.rxn +Ester-amide_isosteres._T_1-trifluoromethyl.rxn +Ester-amide_isosteres._T_cyclopropylamine.rxn +Ester-amide_isosteres.tetrazole.rxn +Ester-amide_isosteres._T_fluorovinyl.rxn +Ester-amide_isosteres._T_oxetane_ether.rxn +Ester-amide_isosteres._T_oxetane.rxn +Ester-amide_isosteres._T_sulfonamide.rxn +Metabolism.acetylene_T_ether.rxn +Metabolism.alkene_T_alkane.rxn +Metabolism.alkene_T_cyclopropyl.rxn +Metabolism.alkene_T_ether.rxn +Metabolism.Benzylic_oxidation.rxn +Metabolism.Benzylic_substitution_C1.rxn +Metabolism.Benzylic_substitution_C2.rxn +Metabolism.Benzylic_substitution.rxn +Metabolism.Biaryl_-_protect_4_position_Br.rxn +Metabolism.Biaryl_-_protect_4_position_Cl.rxn +Metabolism.Biaryl_-_protect_4_position_C.rxn +Metabolism.Biaryl_-_protect_4_position_F.rxn +Metabolism.Biaryl_-_protect_4_position.rxn +Metabolism.Biaryl_-_protect_6_position_Br.rxn +Metabolism.Biaryl_-_protect_6_position_Cl.rxn +Metabolism.Biaryl_-_protect_6_position_C.rxn +Metabolism.Biaryl_-_protect_6_position_F.rxn +Metabolism.Biaryl_-_protect_6_position.rxn +Metabolism.Biaryl_-_protect_7_position_Br.rxn +Metabolism.Biaryl_-_protect_7_position_Cl.rxn +Metabolism.Biaryl_-_protect_7_position_C.rxn +Metabolism.Biaryl_-_protect_7_position_F.rxn +Metabolism.Biaryl_-_protect_7_position.rxn +Metabolism.Block_ortho_to_a_phenol_C1.rxn +Metabolism.Block_ortho_to_a_phenol_C2.rxn +Metabolism.Block_ortho_to_a_phenol_Cl1.rxn +Metabolism.Block_ortho_to_a_phenol_Cl2.rxn +Metabolism.Block_ortho_to_a_phenol_F1.rxn +Metabolism.Block_ortho_to_a_phenol_F2.rxn +Metabolism.Block_ortho_to_a_phenol.rxn +Metabolism.Catechol_T_methylenedioxy.rxn +Metabolism.methyl_T_hydroxymethyl.rxn +Metabolism.OEt_T_OCH2CF3.rxn +Metabolism.OEt_T_OcPr.rxn +Metabolism.OH_T_OCF3.rxn +Metabolism.OH_T_OCH2F.rxn +Metabolism.OH_T_OCHF2.rxn +Metabolism.OH_T_OMe.rxn +Metabolism.OMe_T_OCF3.rxn +Metabolism.OMe_T_OCH2F.rxn +Metabolism.OMe_T_OCHF2.rxn +Metabolism.OMe_T_OcPr.rxn +Metabolism.OMe_T_OEt.rxn +Metabolism.OMe_T_OiPr.rxn +Metabolism.OMe_T_OPr.rxn +Metabolism.Phenol_T_hydroxymethyl.rxn +Metabolism.pyridyl_T_2-6-dimethylpyridyl.rxn +Metabolism.pyridyl_T_2-methyl_pyridyl.rxn +Metabolism.Unsubstituted_aryl_T_4-Cl.rxn +Metabolism.Unsubstituted_aryl_T_4-F.rxn +Metabolism.Unsubstituted_aryl_T_4-Me.rxn +More_aryl_rings.aryl_C_T_aryl_N.rxn +More_aryl_rings.aryl_n_T_aryl_c.rxn +More_aryl_rings.ccn_T_ncc.rxn +More_aryl_rings.cn_T_nc.rxn +More_aryl_rings.cn_T_nn.rxn +More_aryl_rings.furan_T_phenyl.rxn +More_aryl_rings.indole_T_indazole.rxn +More_aryl_rings.indole_T_indolizine.rxn +More_aryl_rings.nccn_T_ncccn.rxn +More_aryl_rings.nccn_T_ncnc.rxn +More_aryl_rings.ncc_T_ncn.rxn +More_aryl_rings.ncc_T_nnc.rxn +More_aryl_rings.ncn_T_nccn.rxn +More_aryl_rings.nH_T_O.rxn +More_aryl_rings.nH_T_s.rxn +More_aryl_rings.nnnc_T_nncn.rxn +More_aryl_rings.nn_T_ncn.rxn +More_aryl_rings.nocn_T_nonc.rxn +More_aryl_rings.nonc_T_nocn.rxn +More_aryl_rings.nscn_T_nsnc.rxn +More_aryl_rings.ocn_T_onc.rxn +More_aryl_rings.onc_T_ocn.rxn +More_aryl_rings.o_T_NH.rxn +More_aryl_rings.o_T_s.rxn +More_aryl_rings.phenyl_--_isoquinolinyl.rxn +More_aryl_rings.phenyl_T_benzimidazole.rxn +More_aryl_rings.phenyl_T_cinnoline.rxn +More_aryl_rings.phenyl_T_furan.rxn +More_aryl_rings.phenyl_T_indole.rxn +More_aryl_rings.phenyl_T_naphthyl.rxn +More_aryl_rings.phenyl_T_phthalazine.rxn +More_aryl_rings.phenyl_T_quinazoline.rxn +More_aryl_rings.phenyl_T_quinolinyl.rxn +More_aryl_rings.phenyl_T_quinoxaline.rxn +More_aryl_rings.phenyl_T_thiophene.rxn +More_aryl_rings.pyrrole_T_indole.rxn +More_aryl_rings.pyrrole_T_phenyl.rxn +More_aryl_rings.scn_T_snc.rxn +More_aryl_rings.snc_T_scn.rxn +More_aryl_rings.s_T_NH.rxn +More_aryl_rings.s_T_o.rxn +More_aryl_rings.thiophene_T_phenyl.rxn +Phenol_isosteres.acetamide.rxn +Phenol_isosteres.benzimidazole.rxn +Phenol_isosteres.benzotriazole.rxn +Phenol_isosteres.hydroxymethyl.rxn +Phenol_isosteres.imidazolone.rxn +Phenol_isosteres.indazole.rxn +Phenol_isosteres.indole.rxn +Phenol_isosteres.isatin.rxn +Phenol_isosteres.N-Me_urea.rxn +Phenol_isosteres.oxindole.rxn +Phenol_isosteres.sulfamide.rxn +Phenol_isosteres.sulfonamide.rxn +Phenol_isosteres.Urea.rxn +Simple_H_Replacement.add_2,2-dimethylethanol.rxn +Simple_H_Replacement.add_acetamide.rxn +Simple_H_Replacement.add_amino.rxn +Simple_H_Replacement.add_carbamoyl.rxn +Simple_H_Replacement.add_carboxylate.rxn +Simple_H_Replacement.add_CH2-CO2H.rxn +Simple_H_Replacement.add_CH2-NH-CH2-CH2-methylsulfone.rxn +Simple_H_Replacement.add_dimethyl.rxn +Simple_H_Replacement.add_ethyl.rxn +Simple_H_Replacement.add_F.rxn +Simple_H_Replacement.add_hydroxyethyl.rxn +Simple_H_Replacement.add_hydroxymethyl.rxn +Simple_H_Replacement.add_hydroxy.rxn +Simple_H_Replacement.add_methyl.rxn +Simple_H_Replacement.add_morpholinyl.rxn +Simple_H_Replacement.add_N-Me_piperazine.rxn +Simple_H_Replacement.add_N,N-dimethylethanolamine.rxn +Simple_H_Replacement.add_N,N-dimethylpropanolamine.rxn +Simple_H_Replacement.add_O-CH2-CH2-pyrrolidine.rxn +Simple_H_Replacement.add_sulfonamide.rxn +Simple_H_Replacement.add_sulfone.rxn +Simple_H_Replacement.add_t-butyl.rxn +Simple_H_Replacement.amine_to_carbamate.rxn +Simple_H_Replacement.amine_to_N-Ac.rxn +Simple_H_Replacement.amine_to_N-Me2.rxn +Simple_H_Replacement.amine_to_N-Me.rxn +Simple_H_Replacement.amine_to_urea.rxn +Simple_H_Replacement.nitrogen_to_oxygen.rxn +Switches.reverse_amide.rxn +Switches.reverse_sulfonamide.rxn +Virtual_Ring.break_open_a_5-ring_to_form_pseudoring.rxn +Virtual_Ring.break_open_a_6-ring_to_form_pseudoring.rxn +Virtual_Ring.break_open_a_cycloheptyl_1.rxn +Virtual_Ring.break_open_a_cycloheptyl_2.rxn +Virtual_Ring.break_open_a_cycloheptyl_3.rxn +Virtual_Ring.break_open_a_cycloheptyl_4.rxn +Virtual_Ring.break_open_a_cycloheptyl.rxn +Virtual_Ring.break_open_a_cyclohexyl_1.rxn +Virtual_Ring.break_open_a_cyclohexyl_2.rxn +Virtual_Ring.break_open_a_cyclohexyl_3.rxn +Virtual_Ring.break_open_a_cyclopentyl_1.rxn +Virtual_Ring.break_open_a_cyclopentyl_2.rxn +Virtual_Ring.create_a_new_ring_with_CH2-CH2-O.rxn +Virtual_Ring.create_a_new_ring_with_CH2-CH2.rxn +Virtual_Ring.create_a_new_ring_with_CH2-N-CH2.rxn +Virtual_Ring.create_a_new_ring_with_CH2-O-CH2.rxn +Virtual_Ring.create_a_new_ring_with_CH2-O.rxn +Virtual_Ring.create_a_new_ring_with_CH2-S-CH2.rxn +Virtual_Ring.create_a_new_ring_with_CH2-S.rxn +Virtual_Ring.create_a_new_ring_with_-O-CH2-CH2.rxn +Virtual_Ring.create_a_new_ring_with_O-CH2.rxn +Virtual_Ring.create_a_new_ring_with_S-CH2.rxn diff --git a/data/MedchemWizard/Simple_H_Replacement.add_2,2-dimethylethanol.rxn b/data/MedchemWizard/Simple_H_Replacement.add_2,2-dimethylethanol.rxn new file mode 100644 index 00000000..e122b8a4 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_2,2-dimethylethanol.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_2,2-dimethylethanol") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]CC(C)(C)O SHR.add_2,2-dimethylethanol") + (A C smarts "CCC(C)(C)O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_CH2-CO2H.rxn b/data/MedchemWizard/Simple_H_Replacement.add_CH2-CO2H.rxn new file mode 100644 index 00000000..b12135a2 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_CH2-CO2H.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_CH2-CO2H") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]C[C](=O)[OH] SHR.add_CH2-CO2H") + (A C smarts "CCC(=O)O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_CH2-NH-CH2-CH2-methylsulfone.rxn b/data/MedchemWizard/Simple_H_Replacement.add_CH2-NH-CH2-CH2-methylsulfone.rxn new file mode 100644 index 00000000..ef254faf --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_CH2-NH-CH2-CH2-methylsulfone.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_CH2-NH-CH2-CH2-methylsulfone") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]C[NH][CH2][CH2]S(=O)(=O)[CH3] SHR.add_CH2-NH-CH2-CH2-methylsulfone") + (A C smarts "CCNCCS(=O)(=O)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_F.rxn b/data/MedchemWizard/Simple_H_Replacement.add_F.rxn new file mode 100644 index 00000000..49e9fcb3 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_F.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_F") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]F SHR.add_F") + (A C smarts "C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_N,N-dimethylethanolamine.rxn b/data/MedchemWizard/Simple_H_Replacement.add_N,N-dimethylethanolamine.rxn new file mode 100644 index 00000000..55f9bffa --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_N,N-dimethylethanolamine.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_N,N-dimethylethanolamine") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]OCCN(C)C SHR.add_N,N-dimethylethanolamine") + (A C smarts "COCCN(C)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_N,N-dimethylpropanolamine.rxn b/data/MedchemWizard/Simple_H_Replacement.add_N,N-dimethylpropanolamine.rxn new file mode 100644 index 00000000..0c80fe95 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_N,N-dimethylpropanolamine.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_N,N-dimethylpropanolamine") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "COCCCN(C)C SHR.add_N,N-dimethylpropanolamine") + (A C smarts "COCCCN") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_N-Me_piperazine.rxn b/data/MedchemWizard/Simple_H_Replacement.add_N-Me_piperazine.rxn new file mode 100644 index 00000000..613ff536 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_N-Me_piperazine.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_N-Me_piperazine") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]N1CCN(CC)CC1 SHR.add_N-Me_piperazine") + (A C smarts "CN1CCN(CC)CC1") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_O-CH2-CH2-pyrrolidine.rxn b/data/MedchemWizard/Simple_H_Replacement.add_O-CH2-CH2-pyrrolidine.rxn new file mode 100644 index 00000000..159b6e72 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_O-CH2-CH2-pyrrolidine.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_O-CH2-CH2-pyrrolidine") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "COCCN1CCCC1 SHR.add_O-CH2-CH2-pyrrolidine") + (A C smarts "COCCN1CCCC1") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_acetamide.rxn b/data/MedchemWizard/Simple_H_Replacement.add_acetamide.rxn new file mode 100644 index 00000000..1ab9a400 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_acetamide.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_acetamide") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]NC(=O)C SHR.add_acetamide") + (A C smarts "CNC(=O)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_amino.rxn b/data/MedchemWizard/Simple_H_Replacement.add_amino.rxn new file mode 100644 index 00000000..052b7175 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_amino.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_amino") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]N(C)(C) SHR.add_amino") + (A C smarts "CN(C)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_carbamoyl.rxn b/data/MedchemWizard/Simple_H_Replacement.add_carbamoyl.rxn new file mode 100644 index 00000000..bc5840b1 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_carbamoyl.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_carbamoyl") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]C(=O)N(C)(C) SHR.add_carbamoyl") + (A C smarts "CC(=O)N(C)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_carboxylate.rxn b/data/MedchemWizard/Simple_H_Replacement.add_carboxylate.rxn new file mode 100644 index 00000000..5e8ed5cd --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_carboxylate.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_carboxylate") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]C(=O)[OH] SHR.add_carboxylate") + (A C smarts "CC(=O)O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_dimethyl.rxn b/data/MedchemWizard/Simple_H_Replacement.add_dimethyl.rxn new file mode 100644 index 00000000..49d02567 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_dimethyl.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_dimethyl") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]1CC1 SHR.add_dimethyl") + (A C smarts "C1CC1") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_ethyl.rxn b/data/MedchemWizard/Simple_H_Replacement.add_ethyl.rxn new file mode 100644 index 00000000..b61caea9 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_ethyl.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_ethyl") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1](C)(C) SHR.add_ethyl") + (A C smarts "C(C)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_hydroxy.rxn b/data/MedchemWizard/Simple_H_Replacement.add_hydroxy.rxn new file mode 100644 index 00000000..ed15a972 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_hydroxy.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_hydroxy") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C]O SHR.add_hydroxy") + (A C smarts "C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_hydroxyethyl.rxn b/data/MedchemWizard/Simple_H_Replacement.add_hydroxyethyl.rxn new file mode 100644 index 00000000..1a4e138f --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_hydroxyethyl.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_hydroxyethyl") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]CCO SHR.add_hydroxyethyl") + (A C smarts "CCCO") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_hydroxymethyl.rxn b/data/MedchemWizard/Simple_H_Replacement.add_hydroxymethyl.rxn new file mode 100644 index 00000000..c905c6ea --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_hydroxymethyl.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_hydroxymethyl") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]CO SHR.add_hydroxymethyl") + (A C smarts "CCO") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_methyl.rxn b/data/MedchemWizard/Simple_H_Replacement.add_methyl.rxn new file mode 100644 index 00000000..45af7467 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_methyl.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_methyl") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "CC SHR.add_methyl") + (A C smarts "CC") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_morpholinyl.rxn b/data/MedchemWizard/Simple_H_Replacement.add_morpholinyl.rxn new file mode 100644 index 00000000..338073e5 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_morpholinyl.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_morpholinyl") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "CCN1CCOCC1 SHR.add_morpholinyl") + (A C smarts "CCN1CCOCC1") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_sulfonamide.rxn b/data/MedchemWizard/Simple_H_Replacement.add_sulfonamide.rxn new file mode 100644 index 00000000..31c53f4c --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_sulfonamide.rxn @@ -0,0 +1,12 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_sulfonamide") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C:1]N(C)S(=O)(=O)C SHR.add_sulfonamide") + (A C smarts "CN(C)S") + (A I join (0 0)) + ) +) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_sulfone.rxn b/data/MedchemWizard/Simple_H_Replacement.add_sulfone.rxn new file mode 100644 index 00000000..7b435d9a --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_sulfone.rxn @@ -0,0 +1,13 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_sulfone") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "CS(=O)C SHR.add_sulfone") + (A C smarts "CS(=O)C") + (A I join (0 0)) + ) +) +) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.add_t-butyl.rxn b/data/MedchemWizard/Simple_H_Replacement.add_t-butyl.rxn new file mode 100644 index 00000000..892d333e --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.add_t-butyl.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.add_t-butyl") + (0 Scaffold + (A C smarts "[CH>0]") + ) + (1 Sidechain + (A C smiles "[C](C)(C)(C) SHR.add_t-butyl") + (A C smarts "C(C)(C)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Ac.rxn b/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Ac.rxn new file mode 100644 index 00000000..df7f74b7 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Ac.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.amine_to_N-Ac") + (0 Scaffold + (A C smarts "[NH>0]") + ) + (1 Sidechain + (A C smiles "[N:1](C)C(=O)C SHR.amine_to_N-Ac") + (A C smarts "N") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Me.rxn b/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Me.rxn new file mode 100644 index 00000000..7f672206 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Me.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.amine_to_N-Me") + (0 Scaffold + (A C smarts "[NH>0]") + ) + (1 Sidechain + (A C smiles "[N:1]C SHR.amine_to_N-Me") + (A C smarts "N") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Me2.rxn b/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Me2.rxn new file mode 100644 index 00000000..52cd685f --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.amine_to_N-Me2.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.amine_to_N-Me2") + (0 Scaffold + (A C smarts "[NH>0]") + ) + (1 Sidechain + (A C smiles "[N:1](C)C SHR.amine_to_N-Me2") + (A C smarts "N") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.amine_to_carbamate.rxn b/data/MedchemWizard/Simple_H_Replacement.amine_to_carbamate.rxn new file mode 100644 index 00000000..f3fa4c4a --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.amine_to_carbamate.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.amine_to_carbamate") + (0 Scaffold + (A C smarts "[NH>0]") + ) + (1 Sidechain + (A C smiles "[N](C)C(=O)OC SHR.amine_to_carbamate") + (A C smarts "N") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.amine_to_urea.rxn b/data/MedchemWizard/Simple_H_Replacement.amine_to_urea.rxn new file mode 100644 index 00000000..463db587 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.amine_to_urea.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.amine_to_urea") + (0 Scaffold + (A C smarts "[NH>0]") + ) + (1 Sidechain + (A C smiles "[N:1](C)C(=O)N(C)C SHR.amine_to_urea") + (A C smarts "N(C)C(=O)N(C)C") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacement.nitrogen_to_oxygen.rxn b/data/MedchemWizard/Simple_H_Replacement.nitrogen_to_oxygen.rxn new file mode 100644 index 00000000..f3145138 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacement.nitrogen_to_oxygen.rxn @@ -0,0 +1,11 @@ +(0 Reaction + (A C Comment "Simple_H_Replacement.nitrogen_to_oxygen") + (0 Scaffold + (A C smarts "[NH>0]") + ) + (1 Sidechain + (A C smiles "O SHR.nitrogen_to_oxygen") + (A C smarts "O") + (A I join (0 0)) + ) +) diff --git a/data/MedchemWizard/Simple_H_Replacements.rb b/data/MedchemWizard/Simple_H_Replacements.rb new file mode 100755 index 00000000..08064740 --- /dev/null +++ b/data/MedchemWizard/Simple_H_Replacements.rb @@ -0,0 +1,78 @@ +#!/usr/bin/env ruby + +ianhome = "/home/rx87851" + +require "#{ianhome}/ruby/lib/iwcmdline.rb" +#require "#{ianhome}/ruby/lib/iwcmdline_v2.rb" +require "#{ianhome}/ruby/lib/bindir.rb" + +$expert = false + +def usage (rc) + $stderr.print "Process the Simple H Replacement file\n" + $stderr.print " -expert more options\n" unless ($expert) + $stderr.print " -v verbose output\n" + exit(rc) +end +# [C:1]>>[C:1]C add methyl +# [C:1]>>[C:1]CO add hydroxymethyl +# [C:1]>>[C:1]CCO add hydroxyethyl + +# IWCmdlineV2 if using v2 + +cl = IWCmdline.new("-v-expert-bindir=dir-keep") + +$expert = cl.option_present('expert') + +if cl.unrecognised_options_encountered() + $stderr.print "Unrecognised options encountered\n" + usage(1) +end + +verbose = cl.option_present('v') + +bindir = Bindir.new(ianhome) + +if cl.option_present('bindir') + cl.values('bindir').each do |d| + bindir.add_dir(d) + end +end + +if 0 == ARGV.size + $stderr.print "Insufficient arguments\n" + usage(2) +end + +ARGF.each do |line| + f = line.chomp.split + next if 0 == f.size + rxn = f.shift + + name = f.join('_') + name.gsub!('"', '') + name.gsub(',', '-') + + j = rxn.split('>>') + $stderr << "Reagents #{j[0]} products #{j[1]} name #{name}\n" + + fname = "Simple_H_Replacement.#{name}.rxn" + outp = File.open(fname, "w") + outp << "(0 Reaction\n" + outp << " (A C Comment \"Simple_H_Replacement.#{name}\")\n" + outp << " (0 Scaffold\n" + if "[C:1]" == j[0] + outp << " (A C smarts \"[CH>0]\")\n" + elsif "[N:1]" == j[0] + outp << " (A C smarts \"[NH>0]\")\n" + else + $stderr << "Unrecognised lhs '#{j[0]}'\n" + exit 1 + end + outp << " )\n" + outp << " (1 Sidechain\n" + outp << " (A C smiles \"#{j[1]} SHR.#{name}\")\n" + outp << " (A I join (0 0))\n" + outp << " )\n" + outp << ")\n" +end diff --git a/data/MedchemWizard/Switches.reverse_amide.rxn b/data/MedchemWizard/Switches.reverse_amide.rxn new file mode 100644 index 00000000..59293200 --- /dev/null +++ b/data/MedchemWizard/Switches.reverse_amide.rxn @@ -0,0 +1,11 @@ +(0 Reaction +# [#6:1][S:2](=O)(=O)-[N:3]-[#6:4]>>[#6:4][S:2](=O)(=O)-[N:3]-[#6:1] reverse amide + (A C Comment "Switches.reverse_amide") + (0 Scaffold + (A C smarts "[#6]-C(=O)-!@[N]-[#6]") + (A I break_bond (0 1)) + (A I break_bond (3 4)) + (A I single_bond (1 4)) + (A I single_bond (0 3)) + ) +) diff --git a/data/MedchemWizard/Switches.reverse_sulfonamide.rxn b/data/MedchemWizard/Switches.reverse_sulfonamide.rxn new file mode 100644 index 00000000..6cfe6353 --- /dev/null +++ b/data/MedchemWizard/Switches.reverse_sulfonamide.rxn @@ -0,0 +1,11 @@ +(0 Reaction +# [#6:1][C:2](=O)[#7:3][#6:4]>>[#6:1][#7:2][C:3](=O)[#6:4] reverse amide + (A C Comment "Switches.reverse_amide") + (0 Scaffold + (A C smarts "[#6]-S(=O)(=O)-!@[N]-[#6]") + (A I break_bond (0 1)) + (A I break_bond (4 5)) + (A I single_bond (1 5)) + (A I single_bond (0 4)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_5-_ring_to_form_pseudoring.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_5-_ring_to_form_pseudoring.rxn new file mode 100644 index 00000000..4ab7891c --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_5-_ring_to_form_pseudoring.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [a:1]1([a:2][a:3][a:4]([*!F!Br!Cl!I:5])a1)[*!F!Br!Cl!I:6]>>[N:1]([a:2][a:3][C:4]([*!F!Br!Cl!I:5])=O)([*!F!Br!Cl!I:6])[H] break open a 5- ring to form pseudoring + + (A C Comment "Virtual_Ring.break_open_a_5-_ring_to_form_pseudoring") + (0 Scaffold + (A C smarts "[F,Cl,Br,I]a1:a:a(-[F,Cl,Br,I]):a:a1") + (A I remove_atom 2) + ) + (1 Sidechain + (A C smiles "O") + (A C smarts "O") + (A I join (3 0 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_5-ring_to_form_pseudoring.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_5-ring_to_form_pseudoring.rxn new file mode 100644 index 00000000..14f57fef --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_5-ring_to_form_pseudoring.rxn @@ -0,0 +1,18 @@ +(0 Reaction +# [a:1]1([a:2][a:3][a:4]([*!F!Br!Cl!I:5])a1)[*!F!Br!Cl!I:6]>>[C:1]([a:2][a:3][N:4]([*!F!Br!Cl!I:5])[H])([*!F!Br!Cl!I:6])=O break open a 5-ring to form pseudoring + + (A C Comment "Virtual_Ring.break_open_a_5-ring_to_form_pseudoring") + (0 Scaffold + (A C smarts "[F,Cl,Br,I]c1a[cD3]([F,Cl,Br,I])aa1") + (A I remove_atom 2) + (A I single_bond (3 5)) + (A I single_bond (5 6)) + (A I single_bond (1 6)) + (A C change_element "1 N") + ) + (1 Sidechain + (A C smiles "O") + (A C smarts "O") + (A I join (3 0 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_6-ring_to_form_pseudoring.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_6-ring_to_form_pseudoring.rxn new file mode 100644 index 00000000..58bfefec --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_6-ring_to_form_pseudoring.rxn @@ -0,0 +1,18 @@ +(0 Reaction +# [c:1]1(aa[c:4]([a:3][a:2]1)[*!F!Br!Cl!I:5])[*!F!Br!Cl!I:6]>>[N:1]([a:2][a:3][C:4]([*!F!Br!Cl!I:5])=O)([*!F!Br!Cl!I:6])[H] break open a 6-ring to form pseudoring + + (A C Comment "Virtual_Ring.break_open_a_6-ring_to_form_pseudoring") + (0 Scaffold + (A C smarts "[F,Cl,Br,I]c1aac([F,Cl,Br,I])aa1") + (A I remove_atom (6 7)) + (A I single_bond (1 2)) + (A I single_bond (2 3)) + (A I single_bond (3 4)) + (A C change_element "1 N") + ) + (1 Sidechain + (A C smiles "O") + (A C smarts "O") + (A I join (4 0 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl.rxn new file mode 100644 index 00000000..09a81b4e --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1][A:8])[*:7])[A:5] break open a cycloheptyl + + (A C Comment "Virtual_Ring.break_open_a_cycloheptyl_1") + (0 Scaffold + (A C smarts "[AR1D3]1[AR1][AR1][AR1][AR1][AR1][AR1]1") + (A I break_bond (0 1)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_1.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_1.rxn new file mode 100644 index 00000000..09a81b4e --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_1.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1][A:8])[*:7])[A:5] break open a cycloheptyl + + (A C Comment "Virtual_Ring.break_open_a_cycloheptyl_1") + (0 Scaffold + (A C smarts "[AR1D3]1[AR1][AR1][AR1][AR1][AR1][AR1]1") + (A I break_bond (0 1)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_2.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_2.rxn new file mode 100644 index 00000000..98c907d6 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_2.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1][A:8])[*:7])[A:5] break open a cycloheptyl + + (A C Comment "Virtual_Ring.break_open_a_cycloheptyl_2") + (0 Scaffold + (A C smarts "[AR1D3]1[AR1][AR1][AR1][AR1][AR1][AR1]1") + (A I break_bond (1 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_3.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_3.rxn new file mode 100644 index 00000000..7d40db2c --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_3.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1][A:8])[*:7])[A:5] break open a cycloheptyl + + (A C Comment "Virtual_Ring.break_open_a_cycloheptyl_3") + (0 Scaffold + (A C smarts "[AR1D3]1[AR1][AR1][AR1][AR1][AR1][AR1]1") + (A I break_bond (2 3)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_4.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_4.rxn new file mode 100644 index 00000000..37a23ca6 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cycloheptyl_4.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:6]1[A;R1:5][A;R1:8][A;R1:1][A;R1:2][A;R1:3]([A;R1:4]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1][A:8])[*:7])[A:5] break open a cycloheptyl + + (A C Comment "Virtual_Ring.break_open_a_cycloheptyl_3") + (0 Scaffold + (A C smarts "[AR1D3]1[AR1][AR1][AR1][AR1][AR1][AR1]1") + (A I break_bond (3 4)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_1.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_1.rxn new file mode 100644 index 00000000..7554f273 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_1.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:6]1[AR1:4][AR1:3]([AR1:2][AR1:1][AR1:5]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1])[*:7])[A:5] break open a cyclohexyl + + (A C Comment "Virtual_Ring.break_open_a_cyclohexyl") + (0 Scaffold + (A C smarts "[AR1]1[AR1][AR1]([AR1][AR1][AR1]1)[*]") + (A I break_bond (0 1)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_2.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_2.rxn new file mode 100644 index 00000000..1581654f --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_2.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:6]1[AR1:4][AR1:3]([AR1:2][AR1:1][AR1:5]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1])[*:7])[A:5] break open a cyclohexyl + + (A C Comment "Virtual_Ring.break_open_a_cyclohexyl_2") + (0 Scaffold + (A C smarts "[AR1]1[AR1][AR1]([AR1][AR1][AR1]1)[*]") + (A I break_bond (1 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_3.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_3.rxn new file mode 100644 index 00000000..24a272fe --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclohexyl_3.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:6]1[AR1:4][AR1:3]([AR1:2][AR1:1][AR1:5]1)[*:7]>>[A:6]([A:4][A:3]([A:2][A:1])[*:7])[A:5] break open a cyclohexyl + + (A C Comment "Virtual_Ring.break_open_a_cyclohexyl_3") + (0 Scaffold + (A C smarts "[AR1]1[AR1][AR1]([AR1][AR1][AR1]1)[*]") + (A I break_bond (2 3)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cyclopentyl_1.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclopentyl_1.rxn new file mode 100644 index 00000000..fd312fb3 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclopentyl_1.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:4]1[A;R1:3]([A;R1:2][A;R1:1][A;R1:5]1)[*:7]>>[A:5][A:1][A:2][A:3]([A:4])[*:7] break open a cyclopentyl + + (A C Comment "Virtual_Ring.break_open_a_cyclopentyl_1") + (0 Scaffold + (A C smarts "[AR1D3]1[AR1][AR1][AR1][AR1]1") + (A I break_bond (0 1)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.break_open_a_cyclopentyl_2.rxn b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclopentyl_2.rxn new file mode 100644 index 00000000..f3c84418 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.break_open_a_cyclopentyl_2.rxn @@ -0,0 +1,9 @@ +(0 Reaction +# [A;R1:4]1[A;R1:3]([A;R1:2][A;R1:1][A;R1:5]1)[*:7]>>[A:5][A:1][A:2][A:3]([A:4])[*:7] break open a cyclopentyl + + (A C Comment "Virtual_Ring.break_open_a_cyclopentyl_1") + (0 Scaffold + (A C smarts "[AR1D3]1[AR1][AR1][AR1][AR1]1") + (A I break_bond (1 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_-O-CH2-CH2.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_-O-CH2-CH2.rxn new file mode 100644 index 00000000..f28d01ae --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_-O-CH2-CH2.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CCO1 create a new ring with -O-CH2-CH2 + + (A C Comment "Virtual_Ring.create_a_new_ring_with_-O-CH2-CH2") + (0 Scaffold + (A C smarts "[aH1][a]!@[a][a;H1]") + ) + (1 Sidechain + (A C smiles "OCCC") + (A C smarts "OCCC") + (A I join (0 0)) + (A I join (3 3)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-CH2-O.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-CH2-O.rxn new file mode 100644 index 00000000..c1abb80b --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-CH2-O.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]COC1 create a new ring with CH2-S-CH2 + + (A C Comment "Virtual_Ring.create_a_new_ring_with_CH2-S-CH2") + (0 Scaffold + (A C smarts "[aH]:[a]!@[a]:[aH]") + (A I embeddings_do_not_overlap 1) + ) + (1 Sidechain + (A C smiles "CCO") + (A C smarts "CCO") + (A I join (0 0)) + (A I join (3 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-CH2.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-CH2.rxn new file mode 100644 index 00000000..3652f87d --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-CH2.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CC1 create a new ring with CH2-CH2 + + (A C Comment "Virtual_Ring.create_a_new_ring_with_CH2-CH2") + (0 Scaffold + (A C smarts "[aH]:[a]!@[a]:[aH]") + (A I embeddings_do_not_overlap 1) + ) + (1 Sidechain + (A C smiles "CC") + (A C smarts "CC") + (A I max_matches 1) + (A I join (0 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-N-CH2.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-N-CH2.rxn new file mode 100644 index 00000000..f191f68c --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-N-CH2.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]COC1 create a new ring with CH2-N-CH2 + + (A C Comment "Virtual_Ring.create_a_new_ring_with_CH2-N-CH2") + (0 Scaffold + (A C smarts "[aH]:[a]!@[a]:[aH]") + (A I embeddings_do_not_overlap 1) + ) + (1 Sidechain + (A C smiles "CNC") + (A C smarts "CNC") + (A I join (0 0)) + (A I join (3 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-O-CH2.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-O-CH2.rxn new file mode 100644 index 00000000..12e82f22 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-O-CH2.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]COC1 create a new ring with CH2-O-CH2 + + (A C Comment "Virtual_Ring.create_a_new_ring_with_CH2-O-CH2") + (0 Scaffold + (A C smarts "[aH]:[a]!@[a]:[aH]") + (A I embeddings_do_not_overlap 1) + ) + (1 Sidechain + (A C smiles "COC") + (A C smarts "COC") + (A I join (0 0)) + (A I join (3 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-O.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-O.rxn new file mode 100644 index 00000000..46cdbfd9 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-O.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]OC1 create a new ring with CH2-O + + (A C Comment "Virtual_Ring.create_a_new_ring_with_CH2-O") + (0 Scaffold + (A C smarts "[aH]:[a]!@[a]:[aH]") + (A I embeddings_do_not_overlap 1) + ) + (1 Sidechain + (A C smiles "CO") + (A C smarts "CO") + (A I max_matches 1) + (A I join (0 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-S-CH2.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-S-CH2.rxn new file mode 100644 index 00000000..45d2ea3f --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-S-CH2.rxn @@ -0,0 +1,15 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]COC1 create a new ring with CH2-S-CH2 + + (A C Comment "Virtual_Ring.create_a_new_ring_with_CH2-S-CH2") + (0 Scaffold + (A C smarts "[aH]:[a]!@[a]:[aH]") + (A I embeddings_do_not_overlap 1) + ) + (1 Sidechain + (A C smiles "CSC") + (A C smarts "CSC") + (A I join (0 0)) + (A I join (3 2)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-S.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-S.rxn new file mode 100644 index 00000000..3ac985f5 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_CH2-S.rxn @@ -0,0 +1,16 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]OC1 create a new ring with CH2-S + + (A C Comment "Virtual_Ring.create_a_new_ring_with_CH2-S") + (0 Scaffold + (A C smarts "[aH]:[a]!@[a]:[aH]") + (A I embeddings_do_not_overlap 1) + ) + (1 Sidechain + (A C smiles "CS") + (A C smarts "CS") + (A I max_matches 1) + (A I join (0 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_O-CH2.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_O-CH2.rxn new file mode 100644 index 00000000..2bb745d1 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_O-CH2.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CO1 create a new ring with O-CH2 + + (A C Comment "Virtual_Ring.create_a_new_ring_with_O-CH2") + (0 Scaffold + (A C smarts "[aH1][a]!@[a][aH1]") + ) + (1 Sidechain + (A C smiles "OC") + (A C smarts "OC") + (A I join (0 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_S-CH2.rxn b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_S-CH2.rxn new file mode 100644 index 00000000..6af4a646 --- /dev/null +++ b/data/MedchemWizard/Virtual_Ring.create_a_new_ring_with_S-CH2.rxn @@ -0,0 +1,14 @@ +(0 Reaction +# [a;H1:1][a:2]!@[a:3][a;H1:4]>>[a:1]1[a:2][a:3][a:4]CS1 create a new ring with S-CH2 + + (A C Comment "Virtual_Ring.create_a_new_ring_with_S-CH2") + (0 Scaffold + (A C smarts "[aH1][a]!@[a][aH1]") + ) + (1 Sidechain + (A C smiles "SC") + (A C smarts "SC") + (A I join (0 0)) + (A I join (3 1)) + ) +) diff --git a/data/MedchemWizard/make_reactions.rb b/data/MedchemWizard/make_reactions.rb new file mode 100755 index 00000000..ff762051 --- /dev/null +++ b/data/MedchemWizard/make_reactions.rb @@ -0,0 +1,69 @@ +#!/usr/bin/env ruby + +ianhome = "/home/rx87851" + +require "#{ianhome}/ruby/lib/iwcmdline.rb" +#require "#{ianhome}/ruby/lib/iwcmdline_v2.rb" +require "#{ianhome}/ruby/lib/bindir.rb" + +$expert = false + +def usage (rc) + $stderr.print "What does this programme do?\n" + $stderr.print " -expert more options\n" unless ($expert) + $stderr.print " -v verbose output\n" + exit(rc) +end + +# IWCmdlineV2 if using v2 + +cl = IWCmdline.new("-v-expert-bindir=dir-keep") + +$expert = cl.option_present('expert') + +if cl.unrecognised_options_encountered() + $stderr.print "Unrecognised options encountered\n" + usage(1) +end + +verbose = cl.option_present('v') + +bindir = Bindir.new(ianhome) + +if cl.option_present('bindir') + cl.values('bindir').each do |d| + bindir.add_dir(d) + end +end + +if 0 == ARGV.size + $stderr.print "Insufficient arguments\n" + usage(2) +end + +header = ARGF.gets.split("\t") + +fname = Array.new +output = Array.new + +istop = 0 + +(0..header.length).step(2) do |i| + fname[i] = header[i].gsub(" ", "_") << ".txt" + + next if /Reference/.match(fname[i]) + fname[i].gsub!(/\//, "-") + $stderr << "Col #{i} is #{header[i]}\n" + + output[i] = File.open(fname[i], "w") + istop = i + 1 +end + + +ARGF.each do |line| + f = line.chomp.split("\t") + (0..istop).step(2) do |i| + rxn = f[i] + output[i] << f[i] << ' ' << f[i+1] << "\n" + end +end diff --git a/contrib/data/abraham_hbond_constants b/data/abraham_hbond_constants similarity index 100% rename from contrib/data/abraham_hbond_constants rename to data/abraham_hbond_constants diff --git a/contrib/data/chembl.ranges b/data/chembl.ranges similarity index 100% rename from contrib/data/chembl.ranges rename to data/chembl.ranges diff --git a/data/pubchem_fingerprints/AAREADME.md b/data/pubchem_fingerprints/AAREADME.md new file mode 100644 index 00000000..a21799dc --- /dev/null +++ b/data/pubchem_fingerprints/AAREADME.md @@ -0,0 +1,13 @@ +# Pubchem Fingerprints +This is an implementation of the Pubchem Substructure Fingerprint set +described at [ncbi](https://ftp.ncbi.nlm.nih.gov/pubchem/specifications/pubchem_fingerprints.pdf). + +While this implementation has not been extensively tested, it does appear to do a +pretty good job of implementing what is described in the description. But with so many +features described, errors are inevitable. + +For tasks of model building and active retrieval, these fingerprints are generally +moderately useful. The script (pubchem_fingerprints.sh](/contrib/script/sh/pubchem_fingerprints.sh) +invokes the pubchem_fingerprints executable with these queries in place. +Computation speed is slow with 10k molecules being processed in 22 seconds - iwecfp +processes the same file in 1.5 seconds. diff --git a/contrib/data/pubchem_fingerprints/section4.smt b/data/pubchem_fingerprints/section4.smt similarity index 100% rename from contrib/data/pubchem_fingerprints/section4.smt rename to data/pubchem_fingerprints/section4.smt diff --git a/contrib/data/pubchem_fingerprints/section5.smt b/data/pubchem_fingerprints/section5.smt similarity index 100% rename from contrib/data/pubchem_fingerprints/section5.smt rename to data/pubchem_fingerprints/section5.smt diff --git a/contrib/data/pubchem_fingerprints/section6.smt b/data/pubchem_fingerprints/section6.smt similarity index 100% rename from contrib/data/pubchem_fingerprints/section6.smt rename to data/pubchem_fingerprints/section6.smt diff --git a/contrib/data/pubchem_fingerprints/section7.smt b/data/pubchem_fingerprints/section7.smt similarity index 100% rename from contrib/data/pubchem_fingerprints/section7.smt rename to data/pubchem_fingerprints/section7.smt diff --git a/contrib/data/queries/PAINS/amino_acridine_A.qry b/data/queries/PAINS/amino_acridine_A.qry similarity index 100% rename from contrib/data/queries/PAINS/amino_acridine_A.qry rename to data/queries/PAINS/amino_acridine_A.qry diff --git a/contrib/data/queries/PAINS/anil_alk_ene.qry b/data/queries/PAINS/anil_alk_ene.qry similarity index 100% rename from contrib/data/queries/PAINS/anil_alk_ene.qry rename to data/queries/PAINS/anil_alk_ene.qry diff --git a/contrib/data/queries/PAINS/anil_di_alk_A.qry b/data/queries/PAINS/anil_di_alk_A.qry similarity index 100% rename from contrib/data/queries/PAINS/anil_di_alk_A.qry rename to data/queries/PAINS/anil_di_alk_A.qry diff --git a/contrib/data/queries/PAINS/anil_di_alk_B.qry b/data/queries/PAINS/anil_di_alk_B.qry similarity index 100% rename from contrib/data/queries/PAINS/anil_di_alk_B.qry rename to data/queries/PAINS/anil_di_alk_B.qry diff --git a/contrib/data/queries/PAINS/anil_di_alk_C.qry b/data/queries/PAINS/anil_di_alk_C.qry similarity index 100% rename from contrib/data/queries/PAINS/anil_di_alk_C.qry rename to data/queries/PAINS/anil_di_alk_C.qry diff --git a/contrib/data/queries/PAINS/anil_di_alk_D.qry b/data/queries/PAINS/anil_di_alk_D.qry similarity index 100% rename from contrib/data/queries/PAINS/anil_di_alk_D.qry rename to data/queries/PAINS/anil_di_alk_D.qry diff --git a/contrib/data/queries/PAINS/anil_di_alk_E.qry b/data/queries/PAINS/anil_di_alk_E.qry similarity index 100% rename from contrib/data/queries/PAINS/anil_di_alk_E.qry rename to data/queries/PAINS/anil_di_alk_E.qry diff --git a/contrib/data/queries/PAINS/anil_no_alk.qry b/data/queries/PAINS/anil_no_alk.qry similarity index 100% rename from contrib/data/queries/PAINS/anil_no_alk.qry rename to data/queries/PAINS/anil_no_alk.qry diff --git a/contrib/data/queries/PAINS/anthranil_acid_A.qry b/data/queries/PAINS/anthranil_acid_A.qry similarity index 100% rename from contrib/data/queries/PAINS/anthranil_acid_A.qry rename to data/queries/PAINS/anthranil_acid_A.qry diff --git a/contrib/data/queries/PAINS/anthranil_one_A.qry b/data/queries/PAINS/anthranil_one_A.qry similarity index 100% rename from contrib/data/queries/PAINS/anthranil_one_A.qry rename to data/queries/PAINS/anthranil_one_A.qry diff --git a/contrib/data/queries/PAINS/azo_A.qry b/data/queries/PAINS/azo_A.qry similarity index 100% rename from contrib/data/queries/PAINS/azo_A.qry rename to data/queries/PAINS/azo_A.qry diff --git a/contrib/data/queries/PAINS/catechol_A.qry b/data/queries/PAINS/catechol_A.qry similarity index 100% rename from contrib/data/queries/PAINS/catechol_A.qry rename to data/queries/PAINS/catechol_A.qry diff --git a/contrib/data/queries/PAINS/cyano_ene_amine_A.qry b/data/queries/PAINS/cyano_ene_amine_A.qry similarity index 100% rename from contrib/data/queries/PAINS/cyano_ene_amine_A.qry rename to data/queries/PAINS/cyano_ene_amine_A.qry diff --git a/contrib/data/queries/PAINS/cyano_imine_A.qry b/data/queries/PAINS/cyano_imine_A.qry similarity index 100% rename from contrib/data/queries/PAINS/cyano_imine_A.qry rename to data/queries/PAINS/cyano_imine_A.qry diff --git a/contrib/data/queries/PAINS/cyano_imine_B.qry b/data/queries/PAINS/cyano_imine_B.qry similarity index 100% rename from contrib/data/queries/PAINS/cyano_imine_B.qry rename to data/queries/PAINS/cyano_imine_B.qry diff --git a/contrib/data/queries/PAINS/cyano_pyridone_A.qry b/data/queries/PAINS/cyano_pyridone_A.qry similarity index 100% rename from contrib/data/queries/PAINS/cyano_pyridone_A.qry rename to data/queries/PAINS/cyano_pyridone_A.qry diff --git a/contrib/data/queries/PAINS/cyano_pyridone_B.qry b/data/queries/PAINS/cyano_pyridone_B.qry similarity index 100% rename from contrib/data/queries/PAINS/cyano_pyridone_B.qry rename to data/queries/PAINS/cyano_pyridone_B.qry diff --git a/contrib/data/queries/PAINS/dhp_bis_amino_CN.qry b/data/queries/PAINS/dhp_bis_amino_CN.qry similarity index 100% rename from contrib/data/queries/PAINS/dhp_bis_amino_CN.qry rename to data/queries/PAINS/dhp_bis_amino_CN.qry diff --git a/contrib/data/queries/PAINS/diazox_sulfon_A.qry b/data/queries/PAINS/diazox_sulfon_A.qry similarity index 100% rename from contrib/data/queries/PAINS/diazox_sulfon_A.qry rename to data/queries/PAINS/diazox_sulfon_A.qry diff --git a/contrib/data/queries/PAINS/dyes3A.qry b/data/queries/PAINS/dyes3A.qry similarity index 100% rename from contrib/data/queries/PAINS/dyes3A.qry rename to data/queries/PAINS/dyes3A.qry diff --git a/contrib/data/queries/PAINS/ene_cyano_A.qry b/data/queries/PAINS/ene_cyano_A.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_cyano_A.qry rename to data/queries/PAINS/ene_cyano_A.qry diff --git a/contrib/data/queries/PAINS/ene_five_het_A.qry b/data/queries/PAINS/ene_five_het_A.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_five_het_A.qry rename to data/queries/PAINS/ene_five_het_A.qry diff --git a/contrib/data/queries/PAINS/ene_five_het_B.qry b/data/queries/PAINS/ene_five_het_B.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_five_het_B.qry rename to data/queries/PAINS/ene_five_het_B.qry diff --git a/contrib/data/queries/PAINS/ene_five_het_C.qry b/data/queries/PAINS/ene_five_het_C.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_five_het_C.qry rename to data/queries/PAINS/ene_five_het_C.qry diff --git a/contrib/data/queries/PAINS/ene_five_het_E.qry b/data/queries/PAINS/ene_five_het_E.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_five_het_E.qry rename to data/queries/PAINS/ene_five_het_E.qry diff --git a/contrib/data/queries/PAINS/ene_five_het_F.qry b/data/queries/PAINS/ene_five_het_F.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_five_het_F.qry rename to data/queries/PAINS/ene_five_het_F.qry diff --git a/contrib/data/queries/PAINS/ene_five_one_A.qry b/data/queries/PAINS/ene_five_one_A.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_five_one_A.qry rename to data/queries/PAINS/ene_five_one_A.qry diff --git a/contrib/data/queries/PAINS/ene_one_ene_A.qry b/data/queries/PAINS/ene_one_ene_A.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_one_ene_A.qry rename to data/queries/PAINS/ene_one_ene_A.qry diff --git a/contrib/data/queries/PAINS/ene_one_ester.qry b/data/queries/PAINS/ene_one_ester.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_one_ester.qry rename to data/queries/PAINS/ene_one_ester.qry diff --git a/contrib/data/queries/PAINS/ene_one_hal.qry b/data/queries/PAINS/ene_one_hal.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_one_hal.qry rename to data/queries/PAINS/ene_one_hal.qry diff --git a/contrib/data/queries/PAINS/ene_rhod_A.qry b/data/queries/PAINS/ene_rhod_A.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_rhod_A.qry rename to data/queries/PAINS/ene_rhod_A.qry diff --git a/contrib/data/queries/PAINS/ene_six_het_A.qry b/data/queries/PAINS/ene_six_het_A.qry similarity index 100% rename from contrib/data/queries/PAINS/ene_six_het_A.qry rename to data/queries/PAINS/ene_six_het_A.qry diff --git a/contrib/data/queries/PAINS/het_65_A.qry b/data/queries/PAINS/het_65_A.qry similarity index 100% rename from contrib/data/queries/PAINS/het_65_A.qry rename to data/queries/PAINS/het_65_A.qry diff --git a/contrib/data/queries/PAINS/het_6_tetrazine.qry b/data/queries/PAINS/het_6_tetrazine.qry similarity index 100% rename from contrib/data/queries/PAINS/het_6_tetrazine.qry rename to data/queries/PAINS/het_6_tetrazine.qry diff --git a/contrib/data/queries/PAINS/het_pyridiniums_A.qry b/data/queries/PAINS/het_pyridiniums_A.qry similarity index 100% rename from contrib/data/queries/PAINS/het_pyridiniums_A.qry rename to data/queries/PAINS/het_pyridiniums_A.qry diff --git a/contrib/data/queries/PAINS/hzone_acyl_naphthol.qry b/data/queries/PAINS/hzone_acyl_naphthol.qry similarity index 100% rename from contrib/data/queries/PAINS/hzone_acyl_naphthol.qry rename to data/queries/PAINS/hzone_acyl_naphthol.qry diff --git a/contrib/data/queries/PAINS/hzone_anil_di_alk.qry b/data/queries/PAINS/hzone_anil_di_alk.qry similarity index 100% rename from contrib/data/queries/PAINS/hzone_anil_di_alk.qry rename to data/queries/PAINS/hzone_anil_di_alk.qry diff --git a/contrib/data/queries/PAINS/hzone_enamin.qry b/data/queries/PAINS/hzone_enamin.qry similarity index 100% rename from contrib/data/queries/PAINS/hzone_enamin.qry rename to data/queries/PAINS/hzone_enamin.qry diff --git a/contrib/data/queries/PAINS/hzone_phenol_A.qry b/data/queries/PAINS/hzone_phenol_A.qry similarity index 100% rename from contrib/data/queries/PAINS/hzone_phenol_A.qry rename to data/queries/PAINS/hzone_phenol_A.qry diff --git a/contrib/data/queries/PAINS/hzone_phenol_B.qry b/data/queries/PAINS/hzone_phenol_B.qry similarity index 100% rename from contrib/data/queries/PAINS/hzone_phenol_B.qry rename to data/queries/PAINS/hzone_phenol_B.qry diff --git a/contrib/data/queries/PAINS/hzone_pipzn.qry b/data/queries/PAINS/hzone_pipzn.qry similarity index 100% rename from contrib/data/queries/PAINS/hzone_pipzn.qry rename to data/queries/PAINS/hzone_pipzn.qry diff --git a/contrib/data/queries/PAINS/imidazole_A.qry b/data/queries/PAINS/imidazole_A.qry similarity index 100% rename from contrib/data/queries/PAINS/imidazole_A.qry rename to data/queries/PAINS/imidazole_A.qry diff --git a/contrib/data/queries/PAINS/imine_one_A.qry b/data/queries/PAINS/imine_one_A.qry similarity index 100% rename from contrib/data/queries/PAINS/imine_one_A.qry rename to data/queries/PAINS/imine_one_A.qry diff --git a/contrib/data/queries/PAINS/imine_one_fives.qry b/data/queries/PAINS/imine_one_fives.qry similarity index 100% rename from contrib/data/queries/PAINS/imine_one_fives.qry rename to data/queries/PAINS/imine_one_fives.qry diff --git a/contrib/data/queries/PAINS/imine_one_isatin.qry b/data/queries/PAINS/imine_one_isatin.qry similarity index 100% rename from contrib/data/queries/PAINS/imine_one_isatin.qry rename to data/queries/PAINS/imine_one_isatin.qry diff --git a/contrib/data/queries/PAINS/indol_3yl_alk.qry b/data/queries/PAINS/indol_3yl_alk.qry similarity index 100% rename from contrib/data/queries/PAINS/indol_3yl_alk.qry rename to data/queries/PAINS/indol_3yl_alk.qry diff --git a/contrib/data/queries/PAINS/keto_keto_beta_A.qry b/data/queries/PAINS/keto_keto_beta_A.qry similarity index 100% rename from contrib/data/queries/PAINS/keto_keto_beta_A.qry rename to data/queries/PAINS/keto_keto_beta_A.qry diff --git a/contrib/data/queries/PAINS/mannich_A.qry b/data/queries/PAINS/mannich_A.qry similarity index 100% rename from contrib/data/queries/PAINS/mannich_A.qry rename to data/queries/PAINS/mannich_A.qry diff --git a/contrib/data/queries/PAINS/naphth_amino_A.qry b/data/queries/PAINS/naphth_amino_A.qry similarity index 100% rename from contrib/data/queries/PAINS/naphth_amino_A.qry rename to data/queries/PAINS/naphth_amino_A.qry diff --git a/contrib/data/queries/PAINS/naphth_amino_B.qry b/data/queries/PAINS/naphth_amino_B.qry similarity index 100% rename from contrib/data/queries/PAINS/naphth_amino_B.qry rename to data/queries/PAINS/naphth_amino_B.qry diff --git a/contrib/data/queries/PAINS/pyrrole_A.qry b/data/queries/PAINS/pyrrole_A.qry similarity index 100% rename from contrib/data/queries/PAINS/pyrrole_A.qry rename to data/queries/PAINS/pyrrole_A.qry diff --git a/contrib/data/queries/PAINS/pyrrole_B.qry b/data/queries/PAINS/pyrrole_B.qry similarity index 100% rename from contrib/data/queries/PAINS/pyrrole_B.qry rename to data/queries/PAINS/pyrrole_B.qry diff --git a/contrib/data/queries/PAINS/queries_latest b/data/queries/PAINS/queries_latest similarity index 100% rename from contrib/data/queries/PAINS/queries_latest rename to data/queries/PAINS/queries_latest diff --git a/contrib/data/queries/PAINS/quinone_A.qry b/data/queries/PAINS/quinone_A.qry similarity index 100% rename from contrib/data/queries/PAINS/quinone_A.qry rename to data/queries/PAINS/quinone_A.qry diff --git a/contrib/data/queries/PAINS/rhod_sat_A.qry b/data/queries/PAINS/rhod_sat_A.qry similarity index 100% rename from contrib/data/queries/PAINS/rhod_sat_A.qry rename to data/queries/PAINS/rhod_sat_A.qry diff --git a/contrib/data/queries/PAINS/sulfonamide_A.qry b/data/queries/PAINS/sulfonamide_A.qry similarity index 100% rename from contrib/data/queries/PAINS/sulfonamide_A.qry rename to data/queries/PAINS/sulfonamide_A.qry diff --git a/contrib/data/queries/PAINS/sulfonamide_B.qry b/data/queries/PAINS/sulfonamide_B.qry similarity index 100% rename from contrib/data/queries/PAINS/sulfonamide_B.qry rename to data/queries/PAINS/sulfonamide_B.qry diff --git a/contrib/data/queries/PAINS/thiaz_ene_A.qry b/data/queries/PAINS/thiaz_ene_A.qry similarity index 100% rename from contrib/data/queries/PAINS/thiaz_ene_A.qry rename to data/queries/PAINS/thiaz_ene_A.qry diff --git a/contrib/data/queries/PAINS/thiaz_ene_B.qry b/data/queries/PAINS/thiaz_ene_B.qry similarity index 100% rename from contrib/data/queries/PAINS/thiaz_ene_B.qry rename to data/queries/PAINS/thiaz_ene_B.qry diff --git a/contrib/data/queries/PAINS/thio_carbonate_A.qry b/data/queries/PAINS/thio_carbonate_A.qry similarity index 100% rename from contrib/data/queries/PAINS/thio_carbonate_A.qry rename to data/queries/PAINS/thio_carbonate_A.qry diff --git a/contrib/data/queries/PAINS/thio_dibenzo.qry b/data/queries/PAINS/thio_dibenzo.qry similarity index 100% rename from contrib/data/queries/PAINS/thio_dibenzo.qry rename to data/queries/PAINS/thio_dibenzo.qry diff --git a/contrib/data/queries/PAINS/thiophene_amino_Aa.qry b/data/queries/PAINS/thiophene_amino_Aa.qry similarity index 100% rename from contrib/data/queries/PAINS/thiophene_amino_Aa.qry rename to data/queries/PAINS/thiophene_amino_Aa.qry diff --git a/contrib/data/queries/PAINS/thiophene_amino_Ab.qry b/data/queries/PAINS/thiophene_amino_Ab.qry similarity index 100% rename from contrib/data/queries/PAINS/thiophene_amino_Ab.qry rename to data/queries/PAINS/thiophene_amino_Ab.qry diff --git a/contrib/data/queries/PAINS/thiophene_hydroxy.qry b/data/queries/PAINS/thiophene_hydroxy.qry similarity index 100% rename from contrib/data/queries/PAINS/thiophene_hydroxy.qry rename to data/queries/PAINS/thiophene_hydroxy.qry diff --git a/contrib/data/queries/abraham/Abraham b/data/queries/abraham/Abraham similarity index 100% rename from contrib/data/queries/abraham/Abraham rename to data/queries/abraham/Abraham diff --git a/contrib/data/queries/abraham/Alpha2H b/data/queries/abraham/Alpha2H similarity index 100% rename from contrib/data/queries/abraham/Alpha2H rename to data/queries/abraham/Alpha2H diff --git a/contrib/data/queries/abraham/ConstantinouGani.Table1 b/data/queries/abraham/ConstantinouGani.Table1 similarity index 100% rename from contrib/data/queries/abraham/ConstantinouGani.Table1 rename to data/queries/abraham/ConstantinouGani.Table1 diff --git a/contrib/data/queries/abraham/ConstantinouGani.Table13 b/data/queries/abraham/ConstantinouGani.Table13 similarity index 100% rename from contrib/data/queries/abraham/ConstantinouGani.Table13 rename to data/queries/abraham/ConstantinouGani.Table13 diff --git a/contrib/data/queries/abraham/ConstantinouGani.Table13.First b/data/queries/abraham/ConstantinouGani.Table13.First similarity index 100% rename from contrib/data/queries/abraham/ConstantinouGani.Table13.First rename to data/queries/abraham/ConstantinouGani.Table13.First diff --git a/contrib/data/queries/abraham/ConstantinouGani.Table2 b/data/queries/abraham/ConstantinouGani.Table2 similarity index 100% rename from contrib/data/queries/abraham/ConstantinouGani.Table2 rename to data/queries/abraham/ConstantinouGani.Table2 diff --git a/contrib/data/queries/abraham/ConstantinouGani.Table24 b/data/queries/abraham/ConstantinouGani.Table24 similarity index 100% rename from contrib/data/queries/abraham/ConstantinouGani.Table24 rename to data/queries/abraham/ConstantinouGani.Table24 diff --git a/contrib/data/queries/abraham/ConstantinouGani.Table3 b/data/queries/abraham/ConstantinouGani.Table3 similarity index 100% rename from contrib/data/queries/abraham/ConstantinouGani.Table3 rename to data/queries/abraham/ConstantinouGani.Table3 diff --git a/contrib/data/queries/abraham/ConstantinouGani.Table4 b/data/queries/abraham/ConstantinouGani.Table4 similarity index 100% rename from contrib/data/queries/abraham/ConstantinouGani.Table4 rename to data/queries/abraham/ConstantinouGani.Table4 diff --git a/contrib/data/queries/charges/2_amino_pyridine.qry b/data/queries/charges/2_amino_pyridine.qry similarity index 100% rename from contrib/data/queries/charges/2_amino_pyridine.qry rename to data/queries/charges/2_amino_pyridine.qry diff --git a/contrib/data/queries/charges/4_amino_pyridine.qry b/data/queries/charges/4_amino_pyridine.qry similarity index 100% rename from contrib/data/queries/charges/4_amino_pyridine.qry rename to data/queries/charges/4_amino_pyridine.qry diff --git a/contrib/data/queries/charges/N_acylpyrazolidinone.qry b/data/queries/charges/N_acylpyrazolidinone.qry similarity index 100% rename from contrib/data/queries/charges/N_acylpyrazolidinone.qry rename to data/queries/charges/N_acylpyrazolidinone.qry diff --git a/contrib/data/queries/charges/N_acylsulfonamide.qry b/data/queries/charges/N_acylsulfonamide.qry similarity index 100% rename from contrib/data/queries/charges/N_acylsulfonamide.qry rename to data/queries/charges/N_acylsulfonamide.qry diff --git a/contrib/data/queries/charges/acid.qry b/data/queries/charges/acid.qry similarity index 100% rename from contrib/data/queries/charges/acid.qry rename to data/queries/charges/acid.qry diff --git a/contrib/data/queries/charges/active b/data/queries/charges/active similarity index 100% rename from contrib/data/queries/charges/active rename to data/queries/charges/active diff --git a/contrib/data/queries/charges/aliphatic_amine.qry b/data/queries/charges/aliphatic_amine.qry similarity index 100% rename from contrib/data/queries/charges/aliphatic_amine.qry rename to data/queries/charges/aliphatic_amine.qry diff --git a/contrib/data/queries/charges/aliphatic_amine_restricted.qry b/data/queries/charges/aliphatic_amine_restricted.qry similarity index 100% rename from contrib/data/queries/charges/aliphatic_amine_restricted.qry rename to data/queries/charges/aliphatic_amine_restricted.qry diff --git a/contrib/data/queries/charges/amidine.qry b/data/queries/charges/amidine.qry similarity index 98% rename from contrib/data/queries/charges/amidine.qry rename to data/queries/charges/amidine.qry index b2bd62e6..958e2f72 100644 --- a/contrib/data/queries/charges/amidine.qry +++ b/data/queries/charges/amidine.qry @@ -6,6 +6,7 @@ (A I atomic_number 7) (A I unsaturation 1) (A I aromatic 0) + (A I aryl 0) (A D numeric_value 1.1) ) (1 Query_Atom diff --git a/contrib/data/queries/charges/amino_terminal.qry b/data/queries/charges/amino_terminal.qry similarity index 100% rename from contrib/data/queries/charges/amino_terminal.qry rename to data/queries/charges/amino_terminal.qry diff --git a/contrib/data/queries/charges/amino_terminal_restricted.qry b/data/queries/charges/amino_terminal_restricted.qry similarity index 100% rename from contrib/data/queries/charges/amino_terminal_restricted.qry rename to data/queries/charges/amino_terminal_restricted.qry diff --git a/contrib/data/queries/charges/carboxylic_acid.qry b/data/queries/charges/carboxylic_acid.qry similarity index 100% rename from contrib/data/queries/charges/carboxylic_acid.qry rename to data/queries/charges/carboxylic_acid.qry diff --git a/contrib/data/queries/charges/fl b/data/queries/charges/fl similarity index 100% rename from contrib/data/queries/charges/fl rename to data/queries/charges/fl diff --git a/contrib/data/queries/charges/guanidine.qry b/data/queries/charges/guanidine.qry similarity index 100% rename from contrib/data/queries/charges/guanidine.qry rename to data/queries/charges/guanidine.qry diff --git a/contrib/data/queries/charges/hydrazine.qry b/data/queries/charges/hydrazine.qry similarity index 100% rename from contrib/data/queries/charges/hydrazine.qry rename to data/queries/charges/hydrazine.qry diff --git a/contrib/data/queries/charges/hydroxamic_acid.qry b/data/queries/charges/hydroxamic_acid.qry similarity index 100% rename from contrib/data/queries/charges/hydroxamic_acid.qry rename to data/queries/charges/hydroxamic_acid.qry diff --git a/contrib/data/queries/charges/imidazole_basic.qry b/data/queries/charges/imidazole_basic.qry similarity index 100% rename from contrib/data/queries/charges/imidazole_basic.qry rename to data/queries/charges/imidazole_basic.qry diff --git a/contrib/data/queries/charges/imidazolidinone.qry b/data/queries/charges/imidazolidinone.qry similarity index 100% rename from contrib/data/queries/charges/imidazolidinone.qry rename to data/queries/charges/imidazolidinone.qry diff --git a/contrib/data/queries/charges/imide.qry b/data/queries/charges/imide.qry similarity index 100% rename from contrib/data/queries/charges/imide.qry rename to data/queries/charges/imide.qry diff --git a/contrib/data/queries/charges/imine.qry b/data/queries/charges/imine.qry similarity index 100% rename from contrib/data/queries/charges/imine.qry rename to data/queries/charges/imine.qry diff --git a/contrib/data/queries/charges/negative b/data/queries/charges/negative similarity index 100% rename from contrib/data/queries/charges/negative rename to data/queries/charges/negative diff --git a/contrib/data/queries/charges/phenolate.qry b/data/queries/charges/phenolate.qry similarity index 100% rename from contrib/data/queries/charges/phenolate.qry rename to data/queries/charges/phenolate.qry diff --git a/contrib/data/queries/charges/phosphonate.qry b/data/queries/charges/phosphonate.qry similarity index 100% rename from contrib/data/queries/charges/phosphonate.qry rename to data/queries/charges/phosphonate.qry diff --git a/contrib/data/queries/charges/positive b/data/queries/charges/positive similarity index 100% rename from contrib/data/queries/charges/positive rename to data/queries/charges/positive diff --git a/contrib/data/queries/charges/pyrazine.qry b/data/queries/charges/pyrazine.qry similarity index 100% rename from contrib/data/queries/charges/pyrazine.qry rename to data/queries/charges/pyrazine.qry diff --git a/contrib/data/queries/charges/pyrazolidinone.qry b/data/queries/charges/pyrazolidinone.qry similarity index 100% rename from contrib/data/queries/charges/pyrazolidinone.qry rename to data/queries/charges/pyrazolidinone.qry diff --git a/contrib/data/queries/charges/pyridazine.qry b/data/queries/charges/pyridazine.qry similarity index 100% rename from contrib/data/queries/charges/pyridazine.qry rename to data/queries/charges/pyridazine.qry diff --git a/data/queries/charges/pyridine_dione.qry b/data/queries/charges/pyridine_dione.qry new file mode 100644 index 00000000..9a9d30ba --- /dev/null +++ b/data/queries/charges/pyridine_dione.qry @@ -0,0 +1,4 @@ +name: "pyridine_dione" +query { + smarts: "[OD1]=[/IWrid1aT3]:[/IWNv{-1}nD2H]:[/IWrid1a]=O" +} diff --git a/contrib/data/queries/charges/pyrimidine.qry b/data/queries/charges/pyrimidine.qry similarity index 100% rename from contrib/data/queries/charges/pyrimidine.qry rename to data/queries/charges/pyrimidine.qry diff --git a/contrib/data/queries/charges/queries b/data/queries/charges/queries similarity index 91% rename from contrib/data/queries/charges/queries rename to data/queries/charges/queries index bede2dcf..c2c1d7f1 100644 --- a/contrib/data/queries/charges/queries +++ b/data/queries/charges/queries @@ -12,3 +12,4 @@ amidine.qry amino_terminal_restricted.qry aliphatic_amine_restricted.qry imidazole_basic.qry +PROTO:pyridine_dione.qry diff --git a/contrib/data/queries/charges/sulfonic_acid.qry b/data/queries/charges/sulfonic_acid.qry similarity index 100% rename from contrib/data/queries/charges/sulfonic_acid.qry rename to data/queries/charges/sulfonic_acid.qry diff --git a/contrib/data/queries/charges/tetrazole.qry b/data/queries/charges/tetrazole.qry similarity index 100% rename from contrib/data/queries/charges/tetrazole.qry rename to data/queries/charges/tetrazole.qry diff --git a/contrib/data/queries/charges/thiazolidinedione.qry b/data/queries/charges/thiazolidinedione.qry similarity index 100% rename from contrib/data/queries/charges/thiazolidinedione.qry rename to data/queries/charges/thiazolidinedione.qry diff --git a/contrib/data/queries/complex_chirality/alanine.smi b/data/queries/complex_chirality/alanine.smi similarity index 100% rename from contrib/data/queries/complex_chirality/alanine.smi rename to data/queries/complex_chirality/alanine.smi diff --git a/contrib/data/queries/functional_groups/EWG.txt b/data/queries/functional_groups/EWG.txt similarity index 100% rename from contrib/data/queries/functional_groups/EWG.txt rename to data/queries/functional_groups/EWG.txt diff --git a/contrib/data/queries/functional_groups/NAS_electrophile.qry b/data/queries/functional_groups/NAS_electrophile.qry similarity index 100% rename from contrib/data/queries/functional_groups/NAS_electrophile.qry rename to data/queries/functional_groups/NAS_electrophile.qry diff --git a/contrib/data/queries/functional_groups/NNH2.qry b/data/queries/functional_groups/NNH2.qry similarity index 100% rename from contrib/data/queries/functional_groups/NNH2.qry rename to data/queries/functional_groups/NNH2.qry diff --git a/contrib/data/queries/functional_groups/a_bromo_ketone.qry b/data/queries/functional_groups/a_bromo_ketone.qry similarity index 100% rename from contrib/data/queries/functional_groups/a_bromo_ketone.qry rename to data/queries/functional_groups/a_bromo_ketone.qry diff --git a/contrib/data/queries/functional_groups/a_h_ketones.qry b/data/queries/functional_groups/a_h_ketones.qry similarity index 100% rename from contrib/data/queries/functional_groups/a_h_ketones.qry rename to data/queries/functional_groups/a_h_ketones.qry diff --git a/contrib/data/queries/functional_groups/a_h_ketones_nonsymmetric.qry b/data/queries/functional_groups/a_h_ketones_nonsymmetric.qry similarity index 100% rename from contrib/data/queries/functional_groups/a_h_ketones_nonsymmetric.qry rename to data/queries/functional_groups/a_h_ketones_nonsymmetric.qry diff --git a/contrib/data/queries/functional_groups/a_h_ketones_symmetric.qry b/data/queries/functional_groups/a_h_ketones_symmetric.qry similarity index 100% rename from contrib/data/queries/functional_groups/a_h_ketones_symmetric.qry rename to data/queries/functional_groups/a_h_ketones_symmetric.qry diff --git a/contrib/data/queries/functional_groups/acetal.qry b/data/queries/functional_groups/acetal.qry similarity index 100% rename from contrib/data/queries/functional_groups/acetal.qry rename to data/queries/functional_groups/acetal.qry diff --git a/contrib/data/queries/functional_groups/acid_chlorides.qry b/data/queries/functional_groups/acid_chlorides.qry similarity index 100% rename from contrib/data/queries/functional_groups/acid_chlorides.qry rename to data/queries/functional_groups/acid_chlorides.qry diff --git a/contrib/data/queries/functional_groups/acrolein.qry b/data/queries/functional_groups/acrolein.qry similarity index 100% rename from contrib/data/queries/functional_groups/acrolein.qry rename to data/queries/functional_groups/acrolein.qry diff --git a/contrib/data/queries/functional_groups/acrylate.qry b/data/queries/functional_groups/acrylate.qry similarity index 100% rename from contrib/data/queries/functional_groups/acrylate.qry rename to data/queries/functional_groups/acrylate.qry diff --git a/contrib/data/queries/functional_groups/acyl_chlorides.qry b/data/queries/functional_groups/acyl_chlorides.qry similarity index 100% rename from contrib/data/queries/functional_groups/acyl_chlorides.qry rename to data/queries/functional_groups/acyl_chlorides.qry diff --git a/contrib/data/queries/functional_groups/alcohols.qry b/data/queries/functional_groups/alcohols.qry similarity index 100% rename from contrib/data/queries/functional_groups/alcohols.qry rename to data/queries/functional_groups/alcohols.qry diff --git a/contrib/data/queries/functional_groups/alcohols_alkyl.qry b/data/queries/functional_groups/alcohols_alkyl.qry similarity index 100% rename from contrib/data/queries/functional_groups/alcohols_alkyl.qry rename to data/queries/functional_groups/alcohols_alkyl.qry diff --git a/contrib/data/queries/functional_groups/aldehyde_aliphatic.qry b/data/queries/functional_groups/aldehyde_aliphatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/aldehyde_aliphatic.qry rename to data/queries/functional_groups/aldehyde_aliphatic.qry diff --git a/contrib/data/queries/functional_groups/aldehyde_aromatic.qry b/data/queries/functional_groups/aldehyde_aromatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/aldehyde_aromatic.qry rename to data/queries/functional_groups/aldehyde_aromatic.qry diff --git a/contrib/data/queries/functional_groups/aldehydes.qry b/data/queries/functional_groups/aldehydes.qry similarity index 100% rename from contrib/data/queries/functional_groups/aldehydes.qry rename to data/queries/functional_groups/aldehydes.qry diff --git a/contrib/data/queries/functional_groups/aliphatic_aldehyde.qry b/data/queries/functional_groups/aliphatic_aldehyde.qry similarity index 100% rename from contrib/data/queries/functional_groups/aliphatic_aldehyde.qry rename to data/queries/functional_groups/aliphatic_aldehyde.qry diff --git a/contrib/data/queries/functional_groups/alkene.qry b/data/queries/functional_groups/alkene.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkene.qry rename to data/queries/functional_groups/alkene.qry diff --git a/contrib/data/queries/functional_groups/alkene_activated.qry b/data/queries/functional_groups/alkene_activated.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkene_activated.qry rename to data/queries/functional_groups/alkene_activated.qry diff --git a/contrib/data/queries/functional_groups/alkene_non_activated.qry b/data/queries/functional_groups/alkene_non_activated.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkene_non_activated.qry rename to data/queries/functional_groups/alkene_non_activated.qry diff --git a/contrib/data/queries/functional_groups/alkyl_sulfur_pyrimidine.qry b/data/queries/functional_groups/alkyl_sulfur_pyrimidine.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkyl_sulfur_pyrimidine.qry rename to data/queries/functional_groups/alkyl_sulfur_pyrimidine.qry diff --git a/contrib/data/queries/functional_groups/alkynes.qry b/data/queries/functional_groups/alkynes.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkynes.qry rename to data/queries/functional_groups/alkynes.qry diff --git a/contrib/data/queries/functional_groups/alkynes_internal.qry b/data/queries/functional_groups/alkynes_internal.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkynes_internal.qry rename to data/queries/functional_groups/alkynes_internal.qry diff --git a/contrib/data/queries/functional_groups/alkynes_internal_activated.qry b/data/queries/functional_groups/alkynes_internal_activated.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkynes_internal_activated.qry rename to data/queries/functional_groups/alkynes_internal_activated.qry diff --git a/contrib/data/queries/functional_groups/alkynes_internal_non_activated.qry b/data/queries/functional_groups/alkynes_internal_non_activated.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkynes_internal_non_activated.qry rename to data/queries/functional_groups/alkynes_internal_non_activated.qry diff --git a/contrib/data/queries/functional_groups/alkynes_terminal.qry b/data/queries/functional_groups/alkynes_terminal.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkynes_terminal.qry rename to data/queries/functional_groups/alkynes_terminal.qry diff --git a/contrib/data/queries/functional_groups/alkynes_terminal_activated.qry b/data/queries/functional_groups/alkynes_terminal_activated.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkynes_terminal_activated.qry rename to data/queries/functional_groups/alkynes_terminal_activated.qry diff --git a/contrib/data/queries/functional_groups/alkynes_terminal_non_activated.qry b/data/queries/functional_groups/alkynes_terminal_non_activated.qry similarity index 100% rename from contrib/data/queries/functional_groups/alkynes_terminal_non_activated.qry rename to data/queries/functional_groups/alkynes_terminal_non_activated.qry diff --git a/contrib/data/queries/functional_groups/alpha_aminoacid.qry b/data/queries/functional_groups/alpha_aminoacid.qry similarity index 100% rename from contrib/data/queries/functional_groups/alpha_aminoacid.qry rename to data/queries/functional_groups/alpha_aminoacid.qry diff --git a/contrib/data/queries/functional_groups/amides.qry b/data/queries/functional_groups/amides.qry similarity index 100% rename from contrib/data/queries/functional_groups/amides.qry rename to data/queries/functional_groups/amides.qry diff --git a/contrib/data/queries/functional_groups/amides_aliphatic.qry b/data/queries/functional_groups/amides_aliphatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/amides_aliphatic.qry rename to data/queries/functional_groups/amides_aliphatic.qry diff --git a/contrib/data/queries/functional_groups/amides_aromatic.qry b/data/queries/functional_groups/amides_aromatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/amides_aromatic.qry rename to data/queries/functional_groups/amides_aromatic.qry diff --git a/contrib/data/queries/functional_groups/amides_primary.qry b/data/queries/functional_groups/amides_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amides_primary.qry rename to data/queries/functional_groups/amides_primary.qry diff --git a/contrib/data/queries/functional_groups/amides_secondary.qry b/data/queries/functional_groups/amides_secondary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amides_secondary.qry rename to data/queries/functional_groups/amides_secondary.qry diff --git a/contrib/data/queries/functional_groups/amidines.qry b/data/queries/functional_groups/amidines.qry similarity index 100% rename from contrib/data/queries/functional_groups/amidines.qry rename to data/queries/functional_groups/amidines.qry diff --git a/contrib/data/queries/functional_groups/amidines_primary.qry b/data/queries/functional_groups/amidines_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amidines_primary.qry rename to data/queries/functional_groups/amidines_primary.qry diff --git a/contrib/data/queries/functional_groups/amidines_secondary.qry b/data/queries/functional_groups/amidines_secondary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amidines_secondary.qry rename to data/queries/functional_groups/amidines_secondary.qry diff --git a/contrib/data/queries/functional_groups/amines.qry b/data/queries/functional_groups/amines.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines.qry rename to data/queries/functional_groups/amines.qry diff --git a/contrib/data/queries/functional_groups/amines_aliphatic.qry b/data/queries/functional_groups/amines_aliphatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aliphatic.qry rename to data/queries/functional_groups/amines_aliphatic.qry diff --git a/contrib/data/queries/functional_groups/amines_aliphatic_primary.qry b/data/queries/functional_groups/amines_aliphatic_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aliphatic_primary.qry rename to data/queries/functional_groups/amines_aliphatic_primary.qry diff --git a/contrib/data/queries/functional_groups/amines_aliphatic_primary_branched.qry b/data/queries/functional_groups/amines_aliphatic_primary_branched.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aliphatic_primary_branched.qry rename to data/queries/functional_groups/amines_aliphatic_primary_branched.qry diff --git a/contrib/data/queries/functional_groups/amines_aliphatic_primary_unbranched.qry b/data/queries/functional_groups/amines_aliphatic_primary_unbranched.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aliphatic_primary_unbranched.qry rename to data/queries/functional_groups/amines_aliphatic_primary_unbranched.qry diff --git a/contrib/data/queries/functional_groups/amines_aliphatic_secondary.qry b/data/queries/functional_groups/amines_aliphatic_secondary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aliphatic_secondary.qry rename to data/queries/functional_groups/amines_aliphatic_secondary.qry diff --git a/contrib/data/queries/functional_groups/amines_aliphatic_secondary_acyclic.qry b/data/queries/functional_groups/amines_aliphatic_secondary_acyclic.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aliphatic_secondary_acyclic.qry rename to data/queries/functional_groups/amines_aliphatic_secondary_acyclic.qry diff --git a/contrib/data/queries/functional_groups/amines_aliphatic_secondary_cyclic.qry b/data/queries/functional_groups/amines_aliphatic_secondary_cyclic.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aliphatic_secondary_cyclic.qry rename to data/queries/functional_groups/amines_aliphatic_secondary_cyclic.qry diff --git a/contrib/data/queries/functional_groups/amines_aromatic.qry b/data/queries/functional_groups/amines_aromatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aromatic.qry rename to data/queries/functional_groups/amines_aromatic.qry diff --git a/contrib/data/queries/functional_groups/amines_aromatic_primary.qry b/data/queries/functional_groups/amines_aromatic_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aromatic_primary.qry rename to data/queries/functional_groups/amines_aromatic_primary.qry diff --git a/contrib/data/queries/functional_groups/amines_aromatic_secondary.qry b/data/queries/functional_groups/amines_aromatic_secondary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aromatic_secondary.qry rename to data/queries/functional_groups/amines_aromatic_secondary.qry diff --git a/contrib/data/queries/functional_groups/amines_aromatic_secondary_1.qry b/data/queries/functional_groups/amines_aromatic_secondary_1.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aromatic_secondary_1.qry rename to data/queries/functional_groups/amines_aromatic_secondary_1.qry diff --git a/contrib/data/queries/functional_groups/amines_aromatic_secondary_2.qry b/data/queries/functional_groups/amines_aromatic_secondary_2.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_aromatic_secondary_2.qry rename to data/queries/functional_groups/amines_aromatic_secondary_2.qry diff --git a/contrib/data/queries/functional_groups/amines_heteroaromatic_primary.qry b/data/queries/functional_groups/amines_heteroaromatic_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_heteroaromatic_primary.qry rename to data/queries/functional_groups/amines_heteroaromatic_primary.qry diff --git a/contrib/data/queries/functional_groups/amines_primary.qry b/data/queries/functional_groups/amines_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_primary.qry rename to data/queries/functional_groups/amines_primary.qry diff --git a/contrib/data/queries/functional_groups/amines_primary_unhindered.qry b/data/queries/functional_groups/amines_primary_unhindered.qry similarity index 100% rename from contrib/data/queries/functional_groups/amines_primary_unhindered.qry rename to data/queries/functional_groups/amines_primary_unhindered.qry diff --git a/contrib/data/queries/functional_groups/aromatic_aldehyde.qry b/data/queries/functional_groups/aromatic_aldehyde.qry similarity index 100% rename from contrib/data/queries/functional_groups/aromatic_aldehyde.qry rename to data/queries/functional_groups/aromatic_aldehyde.qry diff --git a/contrib/data/queries/functional_groups/arylbromide.qry b/data/queries/functional_groups/arylbromide.qry similarity index 100% rename from contrib/data/queries/functional_groups/arylbromide.qry rename to data/queries/functional_groups/arylbromide.qry diff --git a/contrib/data/queries/functional_groups/arylchloride.qry b/data/queries/functional_groups/arylchloride.qry similarity index 100% rename from contrib/data/queries/functional_groups/arylchloride.qry rename to data/queries/functional_groups/arylchloride.qry diff --git a/contrib/data/queries/functional_groups/aryliodide.qry b/data/queries/functional_groups/aryliodide.qry similarity index 100% rename from contrib/data/queries/functional_groups/aryliodide.qry rename to data/queries/functional_groups/aryliodide.qry diff --git a/contrib/data/queries/functional_groups/azide.qry b/data/queries/functional_groups/azide.qry similarity index 100% rename from contrib/data/queries/functional_groups/azide.qry rename to data/queries/functional_groups/azide.qry diff --git a/contrib/data/queries/functional_groups/azide_carbon.qry b/data/queries/functional_groups/azide_carbon.qry similarity index 100% rename from contrib/data/queries/functional_groups/azide_carbon.qry rename to data/queries/functional_groups/azide_carbon.qry diff --git a/contrib/data/queries/functional_groups/azide_sulfonyl.qry b/data/queries/functional_groups/azide_sulfonyl.qry similarity index 100% rename from contrib/data/queries/functional_groups/azide_sulfonyl.qry rename to data/queries/functional_groups/azide_sulfonyl.qry diff --git a/contrib/data/queries/functional_groups/badboron.qry b/data/queries/functional_groups/badboron.qry similarity index 100% rename from contrib/data/queries/functional_groups/badboron.qry rename to data/queries/functional_groups/badboron.qry diff --git a/contrib/data/queries/functional_groups/beta_aminoacid.qry b/data/queries/functional_groups/beta_aminoacid.qry similarity index 100% rename from contrib/data/queries/functional_groups/beta_aminoacid.qry rename to data/queries/functional_groups/beta_aminoacid.qry diff --git a/contrib/data/queries/functional_groups/boc.qry b/data/queries/functional_groups/boc.qry similarity index 100% rename from contrib/data/queries/functional_groups/boc.qry rename to data/queries/functional_groups/boc.qry diff --git a/contrib/data/queries/functional_groups/boronic_acids.qry b/data/queries/functional_groups/boronic_acids.qry similarity index 100% rename from contrib/data/queries/functional_groups/boronic_acids.qry rename to data/queries/functional_groups/boronic_acids.qry diff --git a/contrib/data/queries/functional_groups/boronics.qry b/data/queries/functional_groups/boronics.qry similarity index 100% rename from contrib/data/queries/functional_groups/boronics.qry rename to data/queries/functional_groups/boronics.qry diff --git a/contrib/data/queries/functional_groups/boronics_aliphatic.qry b/data/queries/functional_groups/boronics_aliphatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/boronics_aliphatic.qry rename to data/queries/functional_groups/boronics_aliphatic.qry diff --git a/contrib/data/queries/functional_groups/boronics_aromatic.qry b/data/queries/functional_groups/boronics_aromatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/boronics_aromatic.qry rename to data/queries/functional_groups/boronics_aromatic.qry diff --git a/contrib/data/queries/functional_groups/carbamate.qry b/data/queries/functional_groups/carbamate.qry similarity index 100% rename from contrib/data/queries/functional_groups/carbamate.qry rename to data/queries/functional_groups/carbamate.qry diff --git a/contrib/data/queries/functional_groups/carboxylic_acids.qry b/data/queries/functional_groups/carboxylic_acids.qry similarity index 100% rename from contrib/data/queries/functional_groups/carboxylic_acids.qry rename to data/queries/functional_groups/carboxylic_acids.qry diff --git a/contrib/data/queries/functional_groups/chloroformates.qry b/data/queries/functional_groups/chloroformates.qry similarity index 100% rename from contrib/data/queries/functional_groups/chloroformates.qry rename to data/queries/functional_groups/chloroformates.qry diff --git a/contrib/data/queries/functional_groups/cyano.qry b/data/queries/functional_groups/cyano.qry similarity index 100% rename from contrib/data/queries/functional_groups/cyano.qry rename to data/queries/functional_groups/cyano.qry diff --git a/contrib/data/queries/functional_groups/cyano_alkyl.qry b/data/queries/functional_groups/cyano_alkyl.qry similarity index 100% rename from contrib/data/queries/functional_groups/cyano_alkyl.qry rename to data/queries/functional_groups/cyano_alkyl.qry diff --git a/contrib/data/queries/functional_groups/cyano_amine.qry b/data/queries/functional_groups/cyano_amine.qry similarity index 100% rename from contrib/data/queries/functional_groups/cyano_amine.qry rename to data/queries/functional_groups/cyano_amine.qry diff --git a/contrib/data/queries/functional_groups/cyano_aryl.qry b/data/queries/functional_groups/cyano_aryl.qry similarity index 100% rename from contrib/data/queries/functional_groups/cyano_aryl.qry rename to data/queries/functional_groups/cyano_aryl.qry diff --git a/contrib/data/queries/functional_groups/dicarbonyl_imide.qry b/data/queries/functional_groups/dicarbonyl_imide.qry similarity index 100% rename from contrib/data/queries/functional_groups/dicarbonyl_imide.qry rename to data/queries/functional_groups/dicarbonyl_imide.qry diff --git a/contrib/data/queries/functional_groups/diols.qry b/data/queries/functional_groups/diols.qry similarity index 100% rename from contrib/data/queries/functional_groups/diols.qry rename to data/queries/functional_groups/diols.qry diff --git a/contrib/data/queries/functional_groups/disulfide.qry b/data/queries/functional_groups/disulfide.qry similarity index 100% rename from contrib/data/queries/functional_groups/disulfide.qry rename to data/queries/functional_groups/disulfide.qry diff --git a/contrib/data/queries/functional_groups/esters.qry b/data/queries/functional_groups/esters.qry similarity index 100% rename from contrib/data/queries/functional_groups/esters.qry rename to data/queries/functional_groups/esters.qry diff --git a/contrib/data/queries/functional_groups/esters_carboxylic.qry b/data/queries/functional_groups/esters_carboxylic.qry similarity index 100% rename from contrib/data/queries/functional_groups/esters_carboxylic.qry rename to data/queries/functional_groups/esters_carboxylic.qry diff --git a/contrib/data/queries/functional_groups/esters_methyl.qry b/data/queries/functional_groups/esters_methyl.qry similarity index 100% rename from contrib/data/queries/functional_groups/esters_methyl.qry rename to data/queries/functional_groups/esters_methyl.qry diff --git a/contrib/data/queries/functional_groups/esters_methyl_aliphatic.qry b/data/queries/functional_groups/esters_methyl_aliphatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/esters_methyl_aliphatic.qry rename to data/queries/functional_groups/esters_methyl_aliphatic.qry diff --git a/contrib/data/queries/functional_groups/esters_methyl_aromatic.qry b/data/queries/functional_groups/esters_methyl_aromatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/esters_methyl_aromatic.qry rename to data/queries/functional_groups/esters_methyl_aromatic.qry diff --git a/contrib/data/queries/functional_groups/esters_methyl_ethyl.qry b/data/queries/functional_groups/esters_methyl_ethyl.qry similarity index 100% rename from contrib/data/queries/functional_groups/esters_methyl_ethyl.qry rename to data/queries/functional_groups/esters_methyl_ethyl.qry diff --git a/contrib/data/queries/functional_groups/ethers.qry b/data/queries/functional_groups/ethers.qry similarity index 100% rename from contrib/data/queries/functional_groups/ethers.qry rename to data/queries/functional_groups/ethers.qry diff --git a/contrib/data/queries/functional_groups/fluorinecarbon.qry b/data/queries/functional_groups/fluorinecarbon.qry similarity index 100% rename from contrib/data/queries/functional_groups/fluorinecarbon.qry rename to data/queries/functional_groups/fluorinecarbon.qry diff --git a/contrib/data/queries/functional_groups/fmoc.qry b/data/queries/functional_groups/fmoc.qry similarity index 100% rename from contrib/data/queries/functional_groups/fmoc.qry rename to data/queries/functional_groups/fmoc.qry diff --git a/contrib/data/queries/functional_groups/fragments.qry b/data/queries/functional_groups/fragments.qry similarity index 100% rename from contrib/data/queries/functional_groups/fragments.qry rename to data/queries/functional_groups/fragments.qry diff --git a/contrib/data/queries/functional_groups/guanidines.qry b/data/queries/functional_groups/guanidines.qry similarity index 100% rename from contrib/data/queries/functional_groups/guanidines.qry rename to data/queries/functional_groups/guanidines.qry diff --git a/contrib/data/queries/functional_groups/guanidines_secondary_primary.qry b/data/queries/functional_groups/guanidines_secondary_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/guanidines_secondary_primary.qry rename to data/queries/functional_groups/guanidines_secondary_primary.qry diff --git a/contrib/data/queries/functional_groups/guanidines_secondary_secondary.qry b/data/queries/functional_groups/guanidines_secondary_secondary.qry similarity index 100% rename from contrib/data/queries/functional_groups/guanidines_secondary_secondary.qry rename to data/queries/functional_groups/guanidines_secondary_secondary.qry diff --git a/contrib/data/queries/functional_groups/guanidines_sectert_primary.qry b/data/queries/functional_groups/guanidines_sectert_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/guanidines_sectert_primary.qry rename to data/queries/functional_groups/guanidines_sectert_primary.qry diff --git a/contrib/data/queries/functional_groups/guanidines_tertiary_primary.qry b/data/queries/functional_groups/guanidines_tertiary_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/guanidines_tertiary_primary.qry rename to data/queries/functional_groups/guanidines_tertiary_primary.qry diff --git a/contrib/data/queries/functional_groups/guanidines_tertiary_secondary.qry b/data/queries/functional_groups/guanidines_tertiary_secondary.qry similarity index 100% rename from contrib/data/queries/functional_groups/guanidines_tertiary_secondary.qry rename to data/queries/functional_groups/guanidines_tertiary_secondary.qry diff --git a/contrib/data/queries/functional_groups/halides_alkyl.qry b/data/queries/functional_groups/halides_alkyl.qry similarity index 100% rename from contrib/data/queries/functional_groups/halides_alkyl.qry rename to data/queries/functional_groups/halides_alkyl.qry diff --git a/contrib/data/queries/functional_groups/halides_aryl.qry b/data/queries/functional_groups/halides_aryl.qry similarity index 100% rename from contrib/data/queries/functional_groups/halides_aryl.qry rename to data/queries/functional_groups/halides_aryl.qry diff --git a/contrib/data/queries/functional_groups/halides_benzyl.qry b/data/queries/functional_groups/halides_benzyl.qry similarity index 100% rename from contrib/data/queries/functional_groups/halides_benzyl.qry rename to data/queries/functional_groups/halides_benzyl.qry diff --git a/contrib/data/queries/functional_groups/halides_hetero.qry b/data/queries/functional_groups/halides_hetero.qry similarity index 100% rename from contrib/data/queries/functional_groups/halides_hetero.qry rename to data/queries/functional_groups/halides_hetero.qry diff --git a/contrib/data/queries/functional_groups/haloalkene.qry b/data/queries/functional_groups/haloalkene.qry similarity index 100% rename from contrib/data/queries/functional_groups/haloalkene.qry rename to data/queries/functional_groups/haloalkene.qry diff --git a/contrib/data/queries/functional_groups/hydrazides.qry b/data/queries/functional_groups/hydrazides.qry similarity index 100% rename from contrib/data/queries/functional_groups/hydrazides.qry rename to data/queries/functional_groups/hydrazides.qry diff --git a/contrib/data/queries/functional_groups/hydrazines.qry b/data/queries/functional_groups/hydrazines.qry similarity index 100% rename from contrib/data/queries/functional_groups/hydrazines.qry rename to data/queries/functional_groups/hydrazines.qry diff --git a/contrib/data/queries/functional_groups/hydrazines_primary.qry b/data/queries/functional_groups/hydrazines_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/hydrazines_primary.qry rename to data/queries/functional_groups/hydrazines_primary.qry diff --git a/contrib/data/queries/functional_groups/imines.qry b/data/queries/functional_groups/imines.qry similarity index 100% rename from contrib/data/queries/functional_groups/imines.qry rename to data/queries/functional_groups/imines.qry diff --git a/contrib/data/queries/functional_groups/imines_aliphatic.qry b/data/queries/functional_groups/imines_aliphatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/imines_aliphatic.qry rename to data/queries/functional_groups/imines_aliphatic.qry diff --git a/contrib/data/queries/functional_groups/imines_halide_aromatic.qry b/data/queries/functional_groups/imines_halide_aromatic.qry similarity index 100% rename from contrib/data/queries/functional_groups/imines_halide_aromatic.qry rename to data/queries/functional_groups/imines_halide_aromatic.qry diff --git a/contrib/data/queries/functional_groups/indole.qry b/data/queries/functional_groups/indole.qry similarity index 100% rename from contrib/data/queries/functional_groups/indole.qry rename to data/queries/functional_groups/indole.qry diff --git a/contrib/data/queries/functional_groups/isocyanates.qry b/data/queries/functional_groups/isocyanates.qry similarity index 100% rename from contrib/data/queries/functional_groups/isocyanates.qry rename to data/queries/functional_groups/isocyanates.qry diff --git a/contrib/data/queries/functional_groups/isocyanides.qry b/data/queries/functional_groups/isocyanides.qry similarity index 100% rename from contrib/data/queries/functional_groups/isocyanides.qry rename to data/queries/functional_groups/isocyanides.qry diff --git a/contrib/data/queries/functional_groups/isothiocyanates.qry b/data/queries/functional_groups/isothiocyanates.qry similarity index 100% rename from contrib/data/queries/functional_groups/isothiocyanates.qry rename to data/queries/functional_groups/isothiocyanates.qry diff --git a/contrib/data/queries/functional_groups/isotope.qry b/data/queries/functional_groups/isotope.qry similarity index 100% rename from contrib/data/queries/functional_groups/isotope.qry rename to data/queries/functional_groups/isotope.qry diff --git a/contrib/data/queries/functional_groups/ketal.qry b/data/queries/functional_groups/ketal.qry similarity index 100% rename from contrib/data/queries/functional_groups/ketal.qry rename to data/queries/functional_groups/ketal.qry diff --git a/contrib/data/queries/functional_groups/ketones.qry b/data/queries/functional_groups/ketones.qry similarity index 100% rename from contrib/data/queries/functional_groups/ketones.qry rename to data/queries/functional_groups/ketones.qry diff --git a/contrib/data/queries/functional_groups/ketones_a_bromo.qry b/data/queries/functional_groups/ketones_a_bromo.qry similarity index 100% rename from contrib/data/queries/functional_groups/ketones_a_bromo.qry rename to data/queries/functional_groups/ketones_a_bromo.qry diff --git a/contrib/data/queries/functional_groups/nhydroxyamides.qry b/data/queries/functional_groups/nhydroxyamides.qry similarity index 100% rename from contrib/data/queries/functional_groups/nhydroxyamides.qry rename to data/queries/functional_groups/nhydroxyamides.qry diff --git a/contrib/data/queries/functional_groups/nitriles.qry b/data/queries/functional_groups/nitriles.qry similarity index 100% rename from contrib/data/queries/functional_groups/nitriles.qry rename to data/queries/functional_groups/nitriles.qry diff --git a/contrib/data/queries/functional_groups/nitro.qry b/data/queries/functional_groups/nitro.qry similarity index 100% rename from contrib/data/queries/functional_groups/nitro.qry rename to data/queries/functional_groups/nitro.qry diff --git a/contrib/data/queries/functional_groups/nitro_del.qry b/data/queries/functional_groups/nitro_del.qry similarity index 100% rename from contrib/data/queries/functional_groups/nitro_del.qry rename to data/queries/functional_groups/nitro_del.qry diff --git a/contrib/data/queries/functional_groups/nitro_fluoro.qry b/data/queries/functional_groups/nitro_fluoro.qry similarity index 100% rename from contrib/data/queries/functional_groups/nitro_fluoro.qry rename to data/queries/functional_groups/nitro_fluoro.qry diff --git a/contrib/data/queries/functional_groups/nonorganic.qry b/data/queries/functional_groups/nonorganic.qry similarity index 100% rename from contrib/data/queries/functional_groups/nonorganic.qry rename to data/queries/functional_groups/nonorganic.qry diff --git a/contrib/data/queries/functional_groups/nvoc.qry b/data/queries/functional_groups/nvoc.qry similarity index 100% rename from contrib/data/queries/functional_groups/nvoc.qry rename to data/queries/functional_groups/nvoc.qry diff --git a/contrib/data/queries/functional_groups/o_amino_phenols.qry b/data/queries/functional_groups/o_amino_phenols.qry similarity index 100% rename from contrib/data/queries/functional_groups/o_amino_phenols.qry rename to data/queries/functional_groups/o_amino_phenols.qry diff --git a/contrib/data/queries/functional_groups/o_amino_thiophenols.qry b/data/queries/functional_groups/o_amino_thiophenols.qry similarity index 100% rename from contrib/data/queries/functional_groups/o_amino_thiophenols.qry rename to data/queries/functional_groups/o_amino_thiophenols.qry diff --git a/contrib/data/queries/functional_groups/o_iodo_aniline.qry b/data/queries/functional_groups/o_iodo_aniline.qry similarity index 100% rename from contrib/data/queries/functional_groups/o_iodo_aniline.qry rename to data/queries/functional_groups/o_iodo_aniline.qry diff --git a/contrib/data/queries/functional_groups/o_iodo_sec_aniline.qry b/data/queries/functional_groups/o_iodo_sec_aniline.qry similarity index 100% rename from contrib/data/queries/functional_groups/o_iodo_sec_aniline.qry rename to data/queries/functional_groups/o_iodo_sec_aniline.qry diff --git a/contrib/data/queries/functional_groups/o_nitro_sec_aniline.qry b/data/queries/functional_groups/o_nitro_sec_aniline.qry similarity index 100% rename from contrib/data/queries/functional_groups/o_nitro_sec_aniline.qry rename to data/queries/functional_groups/o_nitro_sec_aniline.qry diff --git a/contrib/data/queries/functional_groups/oxime.qry b/data/queries/functional_groups/oxime.qry similarity index 100% rename from contrib/data/queries/functional_groups/oxime.qry rename to data/queries/functional_groups/oxime.qry diff --git a/contrib/data/queries/functional_groups/phenols.qry b/data/queries/functional_groups/phenols.qry similarity index 100% rename from contrib/data/queries/functional_groups/phenols.qry rename to data/queries/functional_groups/phenols.qry diff --git a/contrib/data/queries/functional_groups/phosphorus.qry b/data/queries/functional_groups/phosphorus.qry similarity index 100% rename from contrib/data/queries/functional_groups/phosphorus.qry rename to data/queries/functional_groups/phosphorus.qry diff --git a/contrib/data/queries/functional_groups/prim_aniline_fmoc.qry b/data/queries/functional_groups/prim_aniline_fmoc.qry similarity index 100% rename from contrib/data/queries/functional_groups/prim_aniline_fmoc.qry rename to data/queries/functional_groups/prim_aniline_fmoc.qry diff --git a/contrib/data/queries/functional_groups/propiolate.qry b/data/queries/functional_groups/propiolate.qry similarity index 100% rename from contrib/data/queries/functional_groups/propiolate.qry rename to data/queries/functional_groups/propiolate.qry diff --git a/contrib/data/queries/functional_groups/propynal.qry b/data/queries/functional_groups/propynal.qry similarity index 100% rename from contrib/data/queries/functional_groups/propynal.qry rename to data/queries/functional_groups/propynal.qry diff --git a/contrib/data/queries/functional_groups/pyrazole.qry b/data/queries/functional_groups/pyrazole.qry similarity index 100% rename from contrib/data/queries/functional_groups/pyrazole.qry rename to data/queries/functional_groups/pyrazole.qry diff --git a/contrib/data/queries/functional_groups/queries_alc b/data/queries/functional_groups/queries_alc similarity index 100% rename from contrib/data/queries/functional_groups/queries_alc rename to data/queries/functional_groups/queries_alc diff --git a/contrib/data/queries/functional_groups/queries_complete b/data/queries/functional_groups/queries_complete similarity index 100% rename from contrib/data/queries/functional_groups/queries_complete rename to data/queries/functional_groups/queries_complete diff --git a/contrib/data/queries/functional_groups/queries_del b/data/queries/functional_groups/queries_del similarity index 100% rename from contrib/data/queries/functional_groups/queries_del rename to data/queries/functional_groups/queries_del diff --git a/contrib/data/queries/functional_groups/queries_delnew b/data/queries/functional_groups/queries_delnew similarity index 100% rename from contrib/data/queries/functional_groups/queries_delnew rename to data/queries/functional_groups/queries_delnew diff --git a/contrib/data/queries/functional_groups/sec_aniline_boc.qry b/data/queries/functional_groups/sec_aniline_boc.qry similarity index 100% rename from contrib/data/queries/functional_groups/sec_aniline_boc.qry rename to data/queries/functional_groups/sec_aniline_boc.qry diff --git a/contrib/data/queries/functional_groups/sec_aniline_fmoc.qry b/data/queries/functional_groups/sec_aniline_fmoc.qry similarity index 100% rename from contrib/data/queries/functional_groups/sec_aniline_fmoc.qry rename to data/queries/functional_groups/sec_aniline_fmoc.qry diff --git a/contrib/data/queries/functional_groups/sec_boc.qry b/data/queries/functional_groups/sec_boc.qry similarity index 100% rename from contrib/data/queries/functional_groups/sec_boc.qry rename to data/queries/functional_groups/sec_boc.qry diff --git a/contrib/data/queries/functional_groups/sec_fmoc.qry b/data/queries/functional_groups/sec_fmoc.qry similarity index 100% rename from contrib/data/queries/functional_groups/sec_fmoc.qry rename to data/queries/functional_groups/sec_fmoc.qry diff --git a/contrib/data/queries/functional_groups/sulfonamides.qry b/data/queries/functional_groups/sulfonamides.qry similarity index 100% rename from contrib/data/queries/functional_groups/sulfonamides.qry rename to data/queries/functional_groups/sulfonamides.qry diff --git a/contrib/data/queries/functional_groups/sulfonamides_acyl.qry b/data/queries/functional_groups/sulfonamides_acyl.qry similarity index 100% rename from contrib/data/queries/functional_groups/sulfonamides_acyl.qry rename to data/queries/functional_groups/sulfonamides_acyl.qry diff --git a/contrib/data/queries/functional_groups/sulfonamides_aryl.qry b/data/queries/functional_groups/sulfonamides_aryl.qry similarity index 100% rename from contrib/data/queries/functional_groups/sulfonamides_aryl.qry rename to data/queries/functional_groups/sulfonamides_aryl.qry diff --git a/contrib/data/queries/functional_groups/sulfonamides_primary.qry b/data/queries/functional_groups/sulfonamides_primary.qry similarity index 100% rename from contrib/data/queries/functional_groups/sulfonamides_primary.qry rename to data/queries/functional_groups/sulfonamides_primary.qry diff --git a/contrib/data/queries/functional_groups/sulfonic_acids.qry b/data/queries/functional_groups/sulfonic_acids.qry similarity index 100% rename from contrib/data/queries/functional_groups/sulfonic_acids.qry rename to data/queries/functional_groups/sulfonic_acids.qry diff --git a/contrib/data/queries/functional_groups/sulfonyl_chlorides.qry b/data/queries/functional_groups/sulfonyl_chlorides.qry similarity index 100% rename from contrib/data/queries/functional_groups/sulfonyl_chlorides.qry rename to data/queries/functional_groups/sulfonyl_chlorides.qry diff --git a/contrib/data/queries/functional_groups/suzuki_boronics.qry b/data/queries/functional_groups/suzuki_boronics.qry similarity index 100% rename from contrib/data/queries/functional_groups/suzuki_boronics.qry rename to data/queries/functional_groups/suzuki_boronics.qry diff --git a/contrib/data/queries/functional_groups/tert_boc.qry b/data/queries/functional_groups/tert_boc.qry similarity index 100% rename from contrib/data/queries/functional_groups/tert_boc.qry rename to data/queries/functional_groups/tert_boc.qry diff --git a/contrib/data/queries/functional_groups/tert_fmoc.qry b/data/queries/functional_groups/tert_fmoc.qry similarity index 100% rename from contrib/data/queries/functional_groups/tert_fmoc.qry rename to data/queries/functional_groups/tert_fmoc.qry diff --git a/contrib/data/queries/functional_groups/tetrazole.qry b/data/queries/functional_groups/tetrazole.qry similarity index 100% rename from contrib/data/queries/functional_groups/tetrazole.qry rename to data/queries/functional_groups/tetrazole.qry diff --git a/contrib/data/queries/functional_groups/thiols.qry b/data/queries/functional_groups/thiols.qry similarity index 100% rename from contrib/data/queries/functional_groups/thiols.qry rename to data/queries/functional_groups/thiols.qry diff --git a/contrib/data/queries/functional_groups/thiophenols.qry b/data/queries/functional_groups/thiophenols.qry similarity index 100% rename from contrib/data/queries/functional_groups/thiophenols.qry rename to data/queries/functional_groups/thiophenols.qry diff --git a/contrib/data/queries/functional_groups/thp.qry b/data/queries/functional_groups/thp.qry similarity index 100% rename from contrib/data/queries/functional_groups/thp.qry rename to data/queries/functional_groups/thp.qry diff --git a/contrib/data/queries/functional_groups/triazine_chloro.qry b/data/queries/functional_groups/triazine_chloro.qry similarity index 100% rename from contrib/data/queries/functional_groups/triazine_chloro.qry rename to data/queries/functional_groups/triazine_chloro.qry diff --git a/contrib/data/queries/functional_groups/triazine_dichloro.qry b/data/queries/functional_groups/triazine_dichloro.qry similarity index 100% rename from contrib/data/queries/functional_groups/triazine_dichloro.qry rename to data/queries/functional_groups/triazine_dichloro.qry diff --git a/contrib/data/queries/functional_groups/triazine_monochloro.qry b/data/queries/functional_groups/triazine_monochloro.qry similarity index 100% rename from contrib/data/queries/functional_groups/triazine_monochloro.qry rename to data/queries/functional_groups/triazine_monochloro.qry diff --git a/contrib/data/queries/functional_groups/triazine_trichloro.qry b/data/queries/functional_groups/triazine_trichloro.qry similarity index 100% rename from contrib/data/queries/functional_groups/triazine_trichloro.qry rename to data/queries/functional_groups/triazine_trichloro.qry diff --git a/contrib/data/queries/functional_groups/trifluoroborates.qry b/data/queries/functional_groups/trifluoroborates.qry similarity index 100% rename from contrib/data/queries/functional_groups/trifluoroborates.qry rename to data/queries/functional_groups/trifluoroborates.qry diff --git a/contrib/data/queries/functional_groups/trityl.qry b/data/queries/functional_groups/trityl.qry similarity index 100% rename from contrib/data/queries/functional_groups/trityl.qry rename to data/queries/functional_groups/trityl.qry diff --git a/contrib/data/queries/functional_groups/ynones.qry b/data/queries/functional_groups/ynones.qry similarity index 100% rename from contrib/data/queries/functional_groups/ynones.qry rename to data/queries/functional_groups/ynones.qry diff --git a/contrib/data/queries/hbondpatterns/A.qry b/data/queries/hbondpatterns/A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A.qry rename to data/queries/hbondpatterns/A.qry diff --git a/contrib/data/queries/hbondpatterns/A1A.qry b/data/queries/hbondpatterns/A1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A.qry rename to data/queries/hbondpatterns/A1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1A1A.qry b/data/queries/hbondpatterns/A1A1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A1A.qry rename to data/queries/hbondpatterns/A1A1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1A1D.qry b/data/queries/hbondpatterns/A1A1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A1D.qry rename to data/queries/hbondpatterns/A1A1D.qry diff --git a/contrib/data/queries/hbondpatterns/A1A2A.qry b/data/queries/hbondpatterns/A1A2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A2A.qry rename to data/queries/hbondpatterns/A1A2A.qry diff --git a/contrib/data/queries/hbondpatterns/A1A2D.qry b/data/queries/hbondpatterns/A1A2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A2D.qry rename to data/queries/hbondpatterns/A1A2D.qry diff --git a/contrib/data/queries/hbondpatterns/A1A3A.qry b/data/queries/hbondpatterns/A1A3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A3A.qry rename to data/queries/hbondpatterns/A1A3A.qry diff --git a/contrib/data/queries/hbondpatterns/A1A3D.qry b/data/queries/hbondpatterns/A1A3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A3D.qry rename to data/queries/hbondpatterns/A1A3D.qry diff --git a/contrib/data/queries/hbondpatterns/A1A4A.qry b/data/queries/hbondpatterns/A1A4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A4A.qry rename to data/queries/hbondpatterns/A1A4A.qry diff --git a/contrib/data/queries/hbondpatterns/A1A4D.qry b/data/queries/hbondpatterns/A1A4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1A4D.qry rename to data/queries/hbondpatterns/A1A4D.qry diff --git a/contrib/data/queries/hbondpatterns/A1B1AE1A.qry b/data/queries/hbondpatterns/A1B1AE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B1AE1A.qry rename to data/queries/hbondpatterns/A1B1AE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B1AEA.qry b/data/queries/hbondpatterns/A1B1AEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B1AEA.qry rename to data/queries/hbondpatterns/A1B1AEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1B1AED.qry b/data/queries/hbondpatterns/A1B1AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B1AED.qry rename to data/queries/hbondpatterns/A1B1AED.qry diff --git a/contrib/data/queries/hbondpatterns/A1B1DE1A.qry b/data/queries/hbondpatterns/A1B1DE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B1DE1A.qry rename to data/queries/hbondpatterns/A1B1DE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B1DE1D.qry b/data/queries/hbondpatterns/A1B1DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B1DE1D.qry rename to data/queries/hbondpatterns/A1B1DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/A1B1DEA.qry b/data/queries/hbondpatterns/A1B1DEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B1DEA.qry rename to data/queries/hbondpatterns/A1B1DEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1B1DED.qry b/data/queries/hbondpatterns/A1B1DED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B1DED.qry rename to data/queries/hbondpatterns/A1B1DED.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2AE1A.qry b/data/queries/hbondpatterns/A1B2AE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2AE1A.qry rename to data/queries/hbondpatterns/A1B2AE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2AE1D.qry b/data/queries/hbondpatterns/A1B2AE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2AE1D.qry rename to data/queries/hbondpatterns/A1B2AE1D.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2AE2A.qry b/data/queries/hbondpatterns/A1B2AE2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2AE2A.qry rename to data/queries/hbondpatterns/A1B2AE2A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2AEA.qry b/data/queries/hbondpatterns/A1B2AEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2AEA.qry rename to data/queries/hbondpatterns/A1B2AEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2AED.qry b/data/queries/hbondpatterns/A1B2AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2AED.qry rename to data/queries/hbondpatterns/A1B2AED.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2DE1A.qry b/data/queries/hbondpatterns/A1B2DE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2DE1A.qry rename to data/queries/hbondpatterns/A1B2DE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2DE1D.qry b/data/queries/hbondpatterns/A1B2DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2DE1D.qry rename to data/queries/hbondpatterns/A1B2DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2DE2A.qry b/data/queries/hbondpatterns/A1B2DE2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2DE2A.qry rename to data/queries/hbondpatterns/A1B2DE2A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2DE2D.qry b/data/queries/hbondpatterns/A1B2DE2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2DE2D.qry rename to data/queries/hbondpatterns/A1B2DE2D.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2DEA.qry b/data/queries/hbondpatterns/A1B2DEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2DEA.qry rename to data/queries/hbondpatterns/A1B2DEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1B2DED.qry b/data/queries/hbondpatterns/A1B2DED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B2DED.qry rename to data/queries/hbondpatterns/A1B2DED.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3AE1A.qry b/data/queries/hbondpatterns/A1B3AE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3AE1A.qry rename to data/queries/hbondpatterns/A1B3AE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3AE1D.qry b/data/queries/hbondpatterns/A1B3AE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3AE1D.qry rename to data/queries/hbondpatterns/A1B3AE1D.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3AE3A.qry b/data/queries/hbondpatterns/A1B3AE3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3AE3A.qry rename to data/queries/hbondpatterns/A1B3AE3A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3AEA.qry b/data/queries/hbondpatterns/A1B3AEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3AEA.qry rename to data/queries/hbondpatterns/A1B3AEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3AED.qry b/data/queries/hbondpatterns/A1B3AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3AED.qry rename to data/queries/hbondpatterns/A1B3AED.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3DE1A.qry b/data/queries/hbondpatterns/A1B3DE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3DE1A.qry rename to data/queries/hbondpatterns/A1B3DE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3DE1D.qry b/data/queries/hbondpatterns/A1B3DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3DE1D.qry rename to data/queries/hbondpatterns/A1B3DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3DE3A.qry b/data/queries/hbondpatterns/A1B3DE3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3DE3A.qry rename to data/queries/hbondpatterns/A1B3DE3A.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3DEA.qry b/data/queries/hbondpatterns/A1B3DEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3DEA.qry rename to data/queries/hbondpatterns/A1B3DEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1B3DED.qry b/data/queries/hbondpatterns/A1B3DED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B3DED.qry rename to data/queries/hbondpatterns/A1B3DED.qry diff --git a/contrib/data/queries/hbondpatterns/A1B4AEA.qry b/data/queries/hbondpatterns/A1B4AEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B4AEA.qry rename to data/queries/hbondpatterns/A1B4AEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1B4AED.qry b/data/queries/hbondpatterns/A1B4AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B4AED.qry rename to data/queries/hbondpatterns/A1B4AED.qry diff --git a/contrib/data/queries/hbondpatterns/A1B4DEA.qry b/data/queries/hbondpatterns/A1B4DEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B4DEA.qry rename to data/queries/hbondpatterns/A1B4DEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1B4DED.qry b/data/queries/hbondpatterns/A1B4DED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B4DED.qry rename to data/queries/hbondpatterns/A1B4DED.qry diff --git a/contrib/data/queries/hbondpatterns/A1B6AED.qry b/data/queries/hbondpatterns/A1B6AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1B6AED.qry rename to data/queries/hbondpatterns/A1B6AED.qry diff --git a/contrib/data/queries/hbondpatterns/A1BAEA.qry b/data/queries/hbondpatterns/A1BAEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1BAEA.qry rename to data/queries/hbondpatterns/A1BAEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1BDEA.qry b/data/queries/hbondpatterns/A1BDEA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1BDEA.qry rename to data/queries/hbondpatterns/A1BDEA.qry diff --git a/contrib/data/queries/hbondpatterns/A1BDED.qry b/data/queries/hbondpatterns/A1BDED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1BDED.qry rename to data/queries/hbondpatterns/A1BDED.qry diff --git a/contrib/data/queries/hbondpatterns/A1D.qry b/data/queries/hbondpatterns/A1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D.qry rename to data/queries/hbondpatterns/A1D.qry diff --git a/contrib/data/queries/hbondpatterns/A1D1A.qry b/data/queries/hbondpatterns/A1D1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D1A.qry rename to data/queries/hbondpatterns/A1D1A.qry diff --git a/contrib/data/queries/hbondpatterns/A1D1D.qry b/data/queries/hbondpatterns/A1D1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D1D.qry rename to data/queries/hbondpatterns/A1D1D.qry diff --git a/contrib/data/queries/hbondpatterns/A1D2A.qry b/data/queries/hbondpatterns/A1D2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D2A.qry rename to data/queries/hbondpatterns/A1D2A.qry diff --git a/contrib/data/queries/hbondpatterns/A1D2D.qry b/data/queries/hbondpatterns/A1D2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D2D.qry rename to data/queries/hbondpatterns/A1D2D.qry diff --git a/contrib/data/queries/hbondpatterns/A1D3A.qry b/data/queries/hbondpatterns/A1D3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D3A.qry rename to data/queries/hbondpatterns/A1D3A.qry diff --git a/contrib/data/queries/hbondpatterns/A1D3D.qry b/data/queries/hbondpatterns/A1D3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D3D.qry rename to data/queries/hbondpatterns/A1D3D.qry diff --git a/contrib/data/queries/hbondpatterns/A1D4A.qry b/data/queries/hbondpatterns/A1D4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D4A.qry rename to data/queries/hbondpatterns/A1D4A.qry diff --git a/contrib/data/queries/hbondpatterns/A1D4D.qry b/data/queries/hbondpatterns/A1D4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D4D.qry rename to data/queries/hbondpatterns/A1D4D.qry diff --git a/contrib/data/queries/hbondpatterns/A1D5A.qry b/data/queries/hbondpatterns/A1D5A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D5A.qry rename to data/queries/hbondpatterns/A1D5A.qry diff --git a/contrib/data/queries/hbondpatterns/A1D5D.qry b/data/queries/hbondpatterns/A1D5D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A1D5D.qry rename to data/queries/hbondpatterns/A1D5D.qry diff --git a/contrib/data/queries/hbondpatterns/A2A.qry b/data/queries/hbondpatterns/A2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2A.qry rename to data/queries/hbondpatterns/A2A.qry diff --git a/contrib/data/queries/hbondpatterns/A2A2A.qry b/data/queries/hbondpatterns/A2A2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2A2A.qry rename to data/queries/hbondpatterns/A2A2A.qry diff --git a/contrib/data/queries/hbondpatterns/A2A2D.qry b/data/queries/hbondpatterns/A2A2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2A2D.qry rename to data/queries/hbondpatterns/A2A2D.qry diff --git a/contrib/data/queries/hbondpatterns/A2A3A.qry b/data/queries/hbondpatterns/A2A3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2A3A.qry rename to data/queries/hbondpatterns/A2A3A.qry diff --git a/contrib/data/queries/hbondpatterns/A2A3D.qry b/data/queries/hbondpatterns/A2A3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2A3D.qry rename to data/queries/hbondpatterns/A2A3D.qry diff --git a/contrib/data/queries/hbondpatterns/A2B1AE1A.qry b/data/queries/hbondpatterns/A2B1AE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2B1AE1A.qry rename to data/queries/hbondpatterns/A2B1AE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A2B1DE1A.qry b/data/queries/hbondpatterns/A2B1DE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2B1DE1A.qry rename to data/queries/hbondpatterns/A2B1DE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A2B1DE1D.qry b/data/queries/hbondpatterns/A2B1DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2B1DE1D.qry rename to data/queries/hbondpatterns/A2B1DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/A2B2AE1A.qry b/data/queries/hbondpatterns/A2B2AE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2B2AE1A.qry rename to data/queries/hbondpatterns/A2B2AE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A2B2AE1D.qry b/data/queries/hbondpatterns/A2B2AE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2B2AE1D.qry rename to data/queries/hbondpatterns/A2B2AE1D.qry diff --git a/contrib/data/queries/hbondpatterns/A2B2DE1A.qry b/data/queries/hbondpatterns/A2B2DE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2B2DE1A.qry rename to data/queries/hbondpatterns/A2B2DE1A.qry diff --git a/contrib/data/queries/hbondpatterns/A2B2DE1D.qry b/data/queries/hbondpatterns/A2B2DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2B2DE1D.qry rename to data/queries/hbondpatterns/A2B2DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/A2D.qry b/data/queries/hbondpatterns/A2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2D.qry rename to data/queries/hbondpatterns/A2D.qry diff --git a/contrib/data/queries/hbondpatterns/A2D2A.qry b/data/queries/hbondpatterns/A2D2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2D2A.qry rename to data/queries/hbondpatterns/A2D2A.qry diff --git a/contrib/data/queries/hbondpatterns/A2D2D.qry b/data/queries/hbondpatterns/A2D2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2D2D.qry rename to data/queries/hbondpatterns/A2D2D.qry diff --git a/contrib/data/queries/hbondpatterns/A2D3A.qry b/data/queries/hbondpatterns/A2D3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2D3A.qry rename to data/queries/hbondpatterns/A2D3A.qry diff --git a/contrib/data/queries/hbondpatterns/A2D3D.qry b/data/queries/hbondpatterns/A2D3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2D3D.qry rename to data/queries/hbondpatterns/A2D3D.qry diff --git a/contrib/data/queries/hbondpatterns/A2D4A.qry b/data/queries/hbondpatterns/A2D4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A2D4A.qry rename to data/queries/hbondpatterns/A2D4A.qry diff --git a/contrib/data/queries/hbondpatterns/A3A.qry b/data/queries/hbondpatterns/A3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A3A.qry rename to data/queries/hbondpatterns/A3A.qry diff --git a/contrib/data/queries/hbondpatterns/A3A3A.qry b/data/queries/hbondpatterns/A3A3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A3A3A.qry rename to data/queries/hbondpatterns/A3A3A.qry diff --git a/contrib/data/queries/hbondpatterns/A3A3D.qry b/data/queries/hbondpatterns/A3A3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A3A3D.qry rename to data/queries/hbondpatterns/A3A3D.qry diff --git a/contrib/data/queries/hbondpatterns/A3D.qry b/data/queries/hbondpatterns/A3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A3D.qry rename to data/queries/hbondpatterns/A3D.qry diff --git a/contrib/data/queries/hbondpatterns/A4A.qry b/data/queries/hbondpatterns/A4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A4A.qry rename to data/queries/hbondpatterns/A4A.qry diff --git a/contrib/data/queries/hbondpatterns/A4D.qry b/data/queries/hbondpatterns/A4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A4D.qry rename to data/queries/hbondpatterns/A4D.qry diff --git a/contrib/data/queries/hbondpatterns/A5A.qry b/data/queries/hbondpatterns/A5A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A5A.qry rename to data/queries/hbondpatterns/A5A.qry diff --git a/contrib/data/queries/hbondpatterns/A5D.qry b/data/queries/hbondpatterns/A5D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A5D.qry rename to data/queries/hbondpatterns/A5D.qry diff --git a/contrib/data/queries/hbondpatterns/A6A.qry b/data/queries/hbondpatterns/A6A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A6A.qry rename to data/queries/hbondpatterns/A6A.qry diff --git a/contrib/data/queries/hbondpatterns/A6D.qry b/data/queries/hbondpatterns/A6D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/A6D.qry rename to data/queries/hbondpatterns/A6D.qry diff --git a/contrib/data/queries/hbondpatterns/AA.qry b/data/queries/hbondpatterns/AA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA.qry rename to data/queries/hbondpatterns/AA.qry diff --git a/contrib/data/queries/hbondpatterns/AA1A.qry b/data/queries/hbondpatterns/AA1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA1A.qry rename to data/queries/hbondpatterns/AA1A.qry diff --git a/contrib/data/queries/hbondpatterns/AA1D.qry b/data/queries/hbondpatterns/AA1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA1D.qry rename to data/queries/hbondpatterns/AA1D.qry diff --git a/contrib/data/queries/hbondpatterns/AA2A.qry b/data/queries/hbondpatterns/AA2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA2A.qry rename to data/queries/hbondpatterns/AA2A.qry diff --git a/contrib/data/queries/hbondpatterns/AA2D.qry b/data/queries/hbondpatterns/AA2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA2D.qry rename to data/queries/hbondpatterns/AA2D.qry diff --git a/contrib/data/queries/hbondpatterns/AA3A.qry b/data/queries/hbondpatterns/AA3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA3A.qry rename to data/queries/hbondpatterns/AA3A.qry diff --git a/contrib/data/queries/hbondpatterns/AA3D.qry b/data/queries/hbondpatterns/AA3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA3D.qry rename to data/queries/hbondpatterns/AA3D.qry diff --git a/contrib/data/queries/hbondpatterns/AA4A.qry b/data/queries/hbondpatterns/AA4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA4A.qry rename to data/queries/hbondpatterns/AA4A.qry diff --git a/contrib/data/queries/hbondpatterns/AA4D.qry b/data/queries/hbondpatterns/AA4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA4D.qry rename to data/queries/hbondpatterns/AA4D.qry diff --git a/contrib/data/queries/hbondpatterns/AA5A.qry b/data/queries/hbondpatterns/AA5A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA5A.qry rename to data/queries/hbondpatterns/AA5A.qry diff --git a/contrib/data/queries/hbondpatterns/AA5D.qry b/data/queries/hbondpatterns/AA5D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AA5D.qry rename to data/queries/hbondpatterns/AA5D.qry diff --git a/contrib/data/queries/hbondpatterns/AAA.qry b/data/queries/hbondpatterns/AAA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AAA.qry rename to data/queries/hbondpatterns/AAA.qry diff --git a/contrib/data/queries/hbondpatterns/AAD.qry b/data/queries/hbondpatterns/AAD.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AAD.qry rename to data/queries/hbondpatterns/AAD.qry diff --git a/contrib/data/queries/hbondpatterns/AD.qry b/data/queries/hbondpatterns/AD.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD.qry rename to data/queries/hbondpatterns/AD.qry diff --git a/contrib/data/queries/hbondpatterns/AD1A.qry b/data/queries/hbondpatterns/AD1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD1A.qry rename to data/queries/hbondpatterns/AD1A.qry diff --git a/contrib/data/queries/hbondpatterns/AD1D.qry b/data/queries/hbondpatterns/AD1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD1D.qry rename to data/queries/hbondpatterns/AD1D.qry diff --git a/contrib/data/queries/hbondpatterns/AD2A.qry b/data/queries/hbondpatterns/AD2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD2A.qry rename to data/queries/hbondpatterns/AD2A.qry diff --git a/contrib/data/queries/hbondpatterns/AD2D.qry b/data/queries/hbondpatterns/AD2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD2D.qry rename to data/queries/hbondpatterns/AD2D.qry diff --git a/contrib/data/queries/hbondpatterns/AD3A.qry b/data/queries/hbondpatterns/AD3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD3A.qry rename to data/queries/hbondpatterns/AD3A.qry diff --git a/contrib/data/queries/hbondpatterns/AD3D.qry b/data/queries/hbondpatterns/AD3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD3D.qry rename to data/queries/hbondpatterns/AD3D.qry diff --git a/contrib/data/queries/hbondpatterns/AD4A.qry b/data/queries/hbondpatterns/AD4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD4A.qry rename to data/queries/hbondpatterns/AD4A.qry diff --git a/contrib/data/queries/hbondpatterns/AD4D.qry b/data/queries/hbondpatterns/AD4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD4D.qry rename to data/queries/hbondpatterns/AD4D.qry diff --git a/contrib/data/queries/hbondpatterns/AD5A.qry b/data/queries/hbondpatterns/AD5A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD5A.qry rename to data/queries/hbondpatterns/AD5A.qry diff --git a/contrib/data/queries/hbondpatterns/AD5D.qry b/data/queries/hbondpatterns/AD5D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/AD5D.qry rename to data/queries/hbondpatterns/AD5D.qry diff --git a/contrib/data/queries/hbondpatterns/ADA.qry b/data/queries/hbondpatterns/ADA.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/ADA.qry rename to data/queries/hbondpatterns/ADA.qry diff --git a/contrib/data/queries/hbondpatterns/ADD.qry b/data/queries/hbondpatterns/ADD.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/ADD.qry rename to data/queries/hbondpatterns/ADD.qry diff --git a/contrib/data/queries/hbondpatterns/D.qry b/data/queries/hbondpatterns/D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D.qry rename to data/queries/hbondpatterns/D.qry diff --git a/contrib/data/queries/hbondpatterns/D1A1D.qry b/data/queries/hbondpatterns/D1A1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1A1D.qry rename to data/queries/hbondpatterns/D1A1D.qry diff --git a/contrib/data/queries/hbondpatterns/D1A2A.qry b/data/queries/hbondpatterns/D1A2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1A2A.qry rename to data/queries/hbondpatterns/D1A2A.qry diff --git a/contrib/data/queries/hbondpatterns/D1A2D.qry b/data/queries/hbondpatterns/D1A2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1A2D.qry rename to data/queries/hbondpatterns/D1A2D.qry diff --git a/contrib/data/queries/hbondpatterns/D1A3A.qry b/data/queries/hbondpatterns/D1A3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1A3A.qry rename to data/queries/hbondpatterns/D1A3A.qry diff --git a/contrib/data/queries/hbondpatterns/D1A3D.qry b/data/queries/hbondpatterns/D1A3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1A3D.qry rename to data/queries/hbondpatterns/D1A3D.qry diff --git a/contrib/data/queries/hbondpatterns/D1A4A.qry b/data/queries/hbondpatterns/D1A4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1A4A.qry rename to data/queries/hbondpatterns/D1A4A.qry diff --git a/contrib/data/queries/hbondpatterns/D1A4D.qry b/data/queries/hbondpatterns/D1A4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1A4D.qry rename to data/queries/hbondpatterns/D1A4D.qry diff --git a/contrib/data/queries/hbondpatterns/D1B1AE1A.qry b/data/queries/hbondpatterns/D1B1AE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B1AE1A.qry rename to data/queries/hbondpatterns/D1B1AE1A.qry diff --git a/contrib/data/queries/hbondpatterns/D1B1AED.qry b/data/queries/hbondpatterns/D1B1AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B1AED.qry rename to data/queries/hbondpatterns/D1B1AED.qry diff --git a/contrib/data/queries/hbondpatterns/D1B1DE1A.qry b/data/queries/hbondpatterns/D1B1DE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B1DE1A.qry rename to data/queries/hbondpatterns/D1B1DE1A.qry diff --git a/contrib/data/queries/hbondpatterns/D1B1DE1D.qry b/data/queries/hbondpatterns/D1B1DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B1DE1D.qry rename to data/queries/hbondpatterns/D1B1DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/D1B1DED.qry b/data/queries/hbondpatterns/D1B1DED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B1DED.qry rename to data/queries/hbondpatterns/D1B1DED.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2AE1A.qry b/data/queries/hbondpatterns/D1B2AE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2AE1A.qry rename to data/queries/hbondpatterns/D1B2AE1A.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2AE1D.qry b/data/queries/hbondpatterns/D1B2AE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2AE1D.qry rename to data/queries/hbondpatterns/D1B2AE1D.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2AE2A.qry b/data/queries/hbondpatterns/D1B2AE2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2AE2A.qry rename to data/queries/hbondpatterns/D1B2AE2A.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2AED.qry b/data/queries/hbondpatterns/D1B2AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2AED.qry rename to data/queries/hbondpatterns/D1B2AED.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2DE1A.qry b/data/queries/hbondpatterns/D1B2DE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2DE1A.qry rename to data/queries/hbondpatterns/D1B2DE1A.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2DE1D.qry b/data/queries/hbondpatterns/D1B2DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2DE1D.qry rename to data/queries/hbondpatterns/D1B2DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2DE2A.qry b/data/queries/hbondpatterns/D1B2DE2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2DE2A.qry rename to data/queries/hbondpatterns/D1B2DE2A.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2DE2D.qry b/data/queries/hbondpatterns/D1B2DE2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2DE2D.qry rename to data/queries/hbondpatterns/D1B2DE2D.qry diff --git a/contrib/data/queries/hbondpatterns/D1B2DED.qry b/data/queries/hbondpatterns/D1B2DED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B2DED.qry rename to data/queries/hbondpatterns/D1B2DED.qry diff --git a/contrib/data/queries/hbondpatterns/D1B3AE1A.qry b/data/queries/hbondpatterns/D1B3AE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B3AE1A.qry rename to data/queries/hbondpatterns/D1B3AE1A.qry diff --git a/contrib/data/queries/hbondpatterns/D1B3AE1D.qry b/data/queries/hbondpatterns/D1B3AE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B3AE1D.qry rename to data/queries/hbondpatterns/D1B3AE1D.qry diff --git a/contrib/data/queries/hbondpatterns/D1B3AED.qry b/data/queries/hbondpatterns/D1B3AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B3AED.qry rename to data/queries/hbondpatterns/D1B3AED.qry diff --git a/contrib/data/queries/hbondpatterns/D1B3DE1A.qry b/data/queries/hbondpatterns/D1B3DE1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B3DE1A.qry rename to data/queries/hbondpatterns/D1B3DE1A.qry diff --git a/contrib/data/queries/hbondpatterns/D1B3DE1D.qry b/data/queries/hbondpatterns/D1B3DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B3DE1D.qry rename to data/queries/hbondpatterns/D1B3DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/D1B3DED.qry b/data/queries/hbondpatterns/D1B3DED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B3DED.qry rename to data/queries/hbondpatterns/D1B3DED.qry diff --git a/contrib/data/queries/hbondpatterns/D1B4AED.qry b/data/queries/hbondpatterns/D1B4AED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B4AED.qry rename to data/queries/hbondpatterns/D1B4AED.qry diff --git a/contrib/data/queries/hbondpatterns/D1B4DED.qry b/data/queries/hbondpatterns/D1B4DED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1B4DED.qry rename to data/queries/hbondpatterns/D1B4DED.qry diff --git a/contrib/data/queries/hbondpatterns/D1BDED.qry b/data/queries/hbondpatterns/D1BDED.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1BDED.qry rename to data/queries/hbondpatterns/D1BDED.qry diff --git a/contrib/data/queries/hbondpatterns/D1D.qry b/data/queries/hbondpatterns/D1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1D.qry rename to data/queries/hbondpatterns/D1D.qry diff --git a/contrib/data/queries/hbondpatterns/D1D1D.qry b/data/queries/hbondpatterns/D1D1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1D1D.qry rename to data/queries/hbondpatterns/D1D1D.qry diff --git a/contrib/data/queries/hbondpatterns/D1D2A.qry b/data/queries/hbondpatterns/D1D2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1D2A.qry rename to data/queries/hbondpatterns/D1D2A.qry diff --git a/contrib/data/queries/hbondpatterns/D1D2D.qry b/data/queries/hbondpatterns/D1D2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1D2D.qry rename to data/queries/hbondpatterns/D1D2D.qry diff --git a/contrib/data/queries/hbondpatterns/D1D3A.qry b/data/queries/hbondpatterns/D1D3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1D3A.qry rename to data/queries/hbondpatterns/D1D3A.qry diff --git a/contrib/data/queries/hbondpatterns/D1D3D.qry b/data/queries/hbondpatterns/D1D3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1D3D.qry rename to data/queries/hbondpatterns/D1D3D.qry diff --git a/contrib/data/queries/hbondpatterns/D1D4A.qry b/data/queries/hbondpatterns/D1D4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1D4A.qry rename to data/queries/hbondpatterns/D1D4A.qry diff --git a/contrib/data/queries/hbondpatterns/D1D4D.qry b/data/queries/hbondpatterns/D1D4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D1D4D.qry rename to data/queries/hbondpatterns/D1D4D.qry diff --git a/contrib/data/queries/hbondpatterns/D2A2D.qry b/data/queries/hbondpatterns/D2A2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2A2D.qry rename to data/queries/hbondpatterns/D2A2D.qry diff --git a/contrib/data/queries/hbondpatterns/D2A3A.qry b/data/queries/hbondpatterns/D2A3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2A3A.qry rename to data/queries/hbondpatterns/D2A3A.qry diff --git a/contrib/data/queries/hbondpatterns/D2A3D.qry b/data/queries/hbondpatterns/D2A3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2A3D.qry rename to data/queries/hbondpatterns/D2A3D.qry diff --git a/contrib/data/queries/hbondpatterns/D2B1DE1D.qry b/data/queries/hbondpatterns/D2B1DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2B1DE1D.qry rename to data/queries/hbondpatterns/D2B1DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/D2B2AE1D.qry b/data/queries/hbondpatterns/D2B2AE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2B2AE1D.qry rename to data/queries/hbondpatterns/D2B2AE1D.qry diff --git a/contrib/data/queries/hbondpatterns/D2B2DE1D.qry b/data/queries/hbondpatterns/D2B2DE1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2B2DE1D.qry rename to data/queries/hbondpatterns/D2B2DE1D.qry diff --git a/contrib/data/queries/hbondpatterns/D2D.qry b/data/queries/hbondpatterns/D2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2D.qry rename to data/queries/hbondpatterns/D2D.qry diff --git a/contrib/data/queries/hbondpatterns/D2D2D.qry b/data/queries/hbondpatterns/D2D2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2D2D.qry rename to data/queries/hbondpatterns/D2D2D.qry diff --git a/contrib/data/queries/hbondpatterns/D2D3A.qry b/data/queries/hbondpatterns/D2D3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2D3A.qry rename to data/queries/hbondpatterns/D2D3A.qry diff --git a/contrib/data/queries/hbondpatterns/D2D3D.qry b/data/queries/hbondpatterns/D2D3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2D3D.qry rename to data/queries/hbondpatterns/D2D3D.qry diff --git a/contrib/data/queries/hbondpatterns/D2D4A.qry b/data/queries/hbondpatterns/D2D4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D2D4A.qry rename to data/queries/hbondpatterns/D2D4A.qry diff --git a/contrib/data/queries/hbondpatterns/D3D.qry b/data/queries/hbondpatterns/D3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D3D.qry rename to data/queries/hbondpatterns/D3D.qry diff --git a/contrib/data/queries/hbondpatterns/D4D.qry b/data/queries/hbondpatterns/D4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D4D.qry rename to data/queries/hbondpatterns/D4D.qry diff --git a/contrib/data/queries/hbondpatterns/D5D.qry b/data/queries/hbondpatterns/D5D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D5D.qry rename to data/queries/hbondpatterns/D5D.qry diff --git a/contrib/data/queries/hbondpatterns/D6D.qry b/data/queries/hbondpatterns/D6D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/D6D.qry rename to data/queries/hbondpatterns/D6D.qry diff --git a/contrib/data/queries/hbondpatterns/DA1A.qry b/data/queries/hbondpatterns/DA1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA1A.qry rename to data/queries/hbondpatterns/DA1A.qry diff --git a/contrib/data/queries/hbondpatterns/DA1D.qry b/data/queries/hbondpatterns/DA1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA1D.qry rename to data/queries/hbondpatterns/DA1D.qry diff --git a/contrib/data/queries/hbondpatterns/DA2A.qry b/data/queries/hbondpatterns/DA2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA2A.qry rename to data/queries/hbondpatterns/DA2A.qry diff --git a/contrib/data/queries/hbondpatterns/DA2D.qry b/data/queries/hbondpatterns/DA2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA2D.qry rename to data/queries/hbondpatterns/DA2D.qry diff --git a/contrib/data/queries/hbondpatterns/DA3A.qry b/data/queries/hbondpatterns/DA3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA3A.qry rename to data/queries/hbondpatterns/DA3A.qry diff --git a/contrib/data/queries/hbondpatterns/DA3D.qry b/data/queries/hbondpatterns/DA3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA3D.qry rename to data/queries/hbondpatterns/DA3D.qry diff --git a/contrib/data/queries/hbondpatterns/DA4A.qry b/data/queries/hbondpatterns/DA4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA4A.qry rename to data/queries/hbondpatterns/DA4A.qry diff --git a/contrib/data/queries/hbondpatterns/DA4D.qry b/data/queries/hbondpatterns/DA4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA4D.qry rename to data/queries/hbondpatterns/DA4D.qry diff --git a/contrib/data/queries/hbondpatterns/DA5A.qry b/data/queries/hbondpatterns/DA5A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA5A.qry rename to data/queries/hbondpatterns/DA5A.qry diff --git a/contrib/data/queries/hbondpatterns/DA5D.qry b/data/queries/hbondpatterns/DA5D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DA5D.qry rename to data/queries/hbondpatterns/DA5D.qry diff --git a/contrib/data/queries/hbondpatterns/DAD.qry b/data/queries/hbondpatterns/DAD.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DAD.qry rename to data/queries/hbondpatterns/DAD.qry diff --git a/contrib/data/queries/hbondpatterns/DD.qry b/data/queries/hbondpatterns/DD.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD.qry rename to data/queries/hbondpatterns/DD.qry diff --git a/contrib/data/queries/hbondpatterns/DD1A.qry b/data/queries/hbondpatterns/DD1A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD1A.qry rename to data/queries/hbondpatterns/DD1A.qry diff --git a/contrib/data/queries/hbondpatterns/DD1D.qry b/data/queries/hbondpatterns/DD1D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD1D.qry rename to data/queries/hbondpatterns/DD1D.qry diff --git a/contrib/data/queries/hbondpatterns/DD2A.qry b/data/queries/hbondpatterns/DD2A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD2A.qry rename to data/queries/hbondpatterns/DD2A.qry diff --git a/contrib/data/queries/hbondpatterns/DD2D.qry b/data/queries/hbondpatterns/DD2D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD2D.qry rename to data/queries/hbondpatterns/DD2D.qry diff --git a/contrib/data/queries/hbondpatterns/DD3A.qry b/data/queries/hbondpatterns/DD3A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD3A.qry rename to data/queries/hbondpatterns/DD3A.qry diff --git a/contrib/data/queries/hbondpatterns/DD3D.qry b/data/queries/hbondpatterns/DD3D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD3D.qry rename to data/queries/hbondpatterns/DD3D.qry diff --git a/contrib/data/queries/hbondpatterns/DD4A.qry b/data/queries/hbondpatterns/DD4A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD4A.qry rename to data/queries/hbondpatterns/DD4A.qry diff --git a/contrib/data/queries/hbondpatterns/DD4D.qry b/data/queries/hbondpatterns/DD4D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD4D.qry rename to data/queries/hbondpatterns/DD4D.qry diff --git a/contrib/data/queries/hbondpatterns/DD5A.qry b/data/queries/hbondpatterns/DD5A.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD5A.qry rename to data/queries/hbondpatterns/DD5A.qry diff --git a/contrib/data/queries/hbondpatterns/DD5D.qry b/data/queries/hbondpatterns/DD5D.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DD5D.qry rename to data/queries/hbondpatterns/DD5D.qry diff --git a/contrib/data/queries/hbondpatterns/DDD.qry b/data/queries/hbondpatterns/DDD.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/DDD.qry rename to data/queries/hbondpatterns/DDD.qry diff --git a/contrib/data/queries/hbondpatterns/counta1.qry b/data/queries/hbondpatterns/counta1.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta1.qry rename to data/queries/hbondpatterns/counta1.qry diff --git a/contrib/data/queries/hbondpatterns/counta10.qry b/data/queries/hbondpatterns/counta10.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta10.qry rename to data/queries/hbondpatterns/counta10.qry diff --git a/contrib/data/queries/hbondpatterns/counta2.qry b/data/queries/hbondpatterns/counta2.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta2.qry rename to data/queries/hbondpatterns/counta2.qry diff --git a/contrib/data/queries/hbondpatterns/counta3.qry b/data/queries/hbondpatterns/counta3.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta3.qry rename to data/queries/hbondpatterns/counta3.qry diff --git a/contrib/data/queries/hbondpatterns/counta4.qry b/data/queries/hbondpatterns/counta4.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta4.qry rename to data/queries/hbondpatterns/counta4.qry diff --git a/contrib/data/queries/hbondpatterns/counta5.qry b/data/queries/hbondpatterns/counta5.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta5.qry rename to data/queries/hbondpatterns/counta5.qry diff --git a/contrib/data/queries/hbondpatterns/counta6.qry b/data/queries/hbondpatterns/counta6.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta6.qry rename to data/queries/hbondpatterns/counta6.qry diff --git a/contrib/data/queries/hbondpatterns/counta7.qry b/data/queries/hbondpatterns/counta7.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta7.qry rename to data/queries/hbondpatterns/counta7.qry diff --git a/contrib/data/queries/hbondpatterns/counta8.qry b/data/queries/hbondpatterns/counta8.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta8.qry rename to data/queries/hbondpatterns/counta8.qry diff --git a/contrib/data/queries/hbondpatterns/counta9.qry b/data/queries/hbondpatterns/counta9.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/counta9.qry rename to data/queries/hbondpatterns/counta9.qry diff --git a/contrib/data/queries/hbondpatterns/countd1.qry b/data/queries/hbondpatterns/countd1.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd1.qry rename to data/queries/hbondpatterns/countd1.qry diff --git a/contrib/data/queries/hbondpatterns/countd10.qry b/data/queries/hbondpatterns/countd10.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd10.qry rename to data/queries/hbondpatterns/countd10.qry diff --git a/contrib/data/queries/hbondpatterns/countd2.qry b/data/queries/hbondpatterns/countd2.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd2.qry rename to data/queries/hbondpatterns/countd2.qry diff --git a/contrib/data/queries/hbondpatterns/countd3.qry b/data/queries/hbondpatterns/countd3.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd3.qry rename to data/queries/hbondpatterns/countd3.qry diff --git a/contrib/data/queries/hbondpatterns/countd4.qry b/data/queries/hbondpatterns/countd4.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd4.qry rename to data/queries/hbondpatterns/countd4.qry diff --git a/contrib/data/queries/hbondpatterns/countd5.qry b/data/queries/hbondpatterns/countd5.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd5.qry rename to data/queries/hbondpatterns/countd5.qry diff --git a/contrib/data/queries/hbondpatterns/countd6.qry b/data/queries/hbondpatterns/countd6.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd6.qry rename to data/queries/hbondpatterns/countd6.qry diff --git a/contrib/data/queries/hbondpatterns/countd7.qry b/data/queries/hbondpatterns/countd7.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd7.qry rename to data/queries/hbondpatterns/countd7.qry diff --git a/contrib/data/queries/hbondpatterns/countd8.qry b/data/queries/hbondpatterns/countd8.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd8.qry rename to data/queries/hbondpatterns/countd8.qry diff --git a/contrib/data/queries/hbondpatterns/countd9.qry b/data/queries/hbondpatterns/countd9.qry similarity index 100% rename from contrib/data/queries/hbondpatterns/countd9.qry rename to data/queries/hbondpatterns/countd9.qry diff --git a/contrib/data/queries/hbondpatterns/nass b/data/queries/hbondpatterns/nass similarity index 100% rename from contrib/data/queries/hbondpatterns/nass rename to data/queries/hbondpatterns/nass diff --git a/contrib/data/queries/hbondpatterns/nass.26may00 b/data/queries/hbondpatterns/nass.26may00 similarity index 100% rename from contrib/data/queries/hbondpatterns/nass.26may00 rename to data/queries/hbondpatterns/nass.26may00 diff --git a/contrib/data/queries/hbondpatterns/nass.s1 b/data/queries/hbondpatterns/nass.s1 similarity index 100% rename from contrib/data/queries/hbondpatterns/nass.s1 rename to data/queries/hbondpatterns/nass.s1 diff --git a/contrib/data/queries/hbondpatterns/nass.s2 b/data/queries/hbondpatterns/nass.s2 similarity index 100% rename from contrib/data/queries/hbondpatterns/nass.s2 rename to data/queries/hbondpatterns/nass.s2 diff --git a/contrib/data/queries/hbondpatterns/queries b/data/queries/hbondpatterns/queries similarity index 100% rename from contrib/data/queries/hbondpatterns/queries rename to data/queries/hbondpatterns/queries diff --git a/contrib/data/queries/hbonds/acceptor b/data/queries/hbonds/acceptor similarity index 100% rename from contrib/data/queries/hbonds/acceptor rename to data/queries/hbonds/acceptor diff --git a/contrib/data/queries/hbonds/aminunch.qry b/data/queries/hbonds/aminunch.qry similarity index 100% rename from contrib/data/queries/hbonds/aminunch.qry rename to data/queries/hbonds/aminunch.qry diff --git a/contrib/data/queries/hbonds/carbonyl.qry b/data/queries/hbonds/carbonyl.qry similarity index 100% rename from contrib/data/queries/hbonds/carbonyl.qry rename to data/queries/hbonds/carbonyl.qry diff --git a/contrib/data/queries/hbonds/cyano.qry b/data/queries/hbonds/cyano.qry similarity index 100% rename from contrib/data/queries/hbonds/cyano.qry rename to data/queries/hbonds/cyano.qry diff --git a/contrib/data/queries/hbonds/donor.qry b/data/queries/hbonds/donor.qry similarity index 100% rename from contrib/data/queries/hbonds/donor.qry rename to data/queries/hbonds/donor.qry diff --git a/contrib/data/queries/hbonds/ether.qry b/data/queries/hbonds/ether.qry similarity index 100% rename from contrib/data/queries/hbonds/ether.qry rename to data/queries/hbonds/ether.qry diff --git a/contrib/data/queries/hbonds/hydroxam.qry b/data/queries/hbonds/hydroxam.qry similarity index 100% rename from contrib/data/queries/hbonds/hydroxam.qry rename to data/queries/hbonds/hydroxam.qry diff --git a/contrib/data/queries/hbonds/hydroxyl.qry b/data/queries/hbonds/hydroxyl.qry similarity index 100% rename from contrib/data/queries/hbonds/hydroxyl.qry rename to data/queries/hbonds/hydroxyl.qry diff --git a/contrib/data/queries/hbonds/imine.qry b/data/queries/hbonds/imine.qry similarity index 100% rename from contrib/data/queries/hbonds/imine.qry rename to data/queries/hbonds/imine.qry diff --git a/contrib/data/queries/hbonds/qminus.qry b/data/queries/hbonds/qminus.qry similarity index 100% rename from contrib/data/queries/hbonds/qminus.qry rename to data/queries/hbonds/qminus.qry diff --git a/contrib/data/queries/heteroatoms/A.qry b/data/queries/heteroatoms/A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A.qry rename to data/queries/heteroatoms/A.qry diff --git a/contrib/data/queries/heteroatoms/A1A.qry b/data/queries/heteroatoms/A1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A.qry rename to data/queries/heteroatoms/A1A.qry diff --git a/contrib/data/queries/heteroatoms/A1A1A.qry b/data/queries/heteroatoms/A1A1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A1A.qry rename to data/queries/heteroatoms/A1A1A.qry diff --git a/contrib/data/queries/heteroatoms/A1A1D.qry b/data/queries/heteroatoms/A1A1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A1D.qry rename to data/queries/heteroatoms/A1A1D.qry diff --git a/contrib/data/queries/heteroatoms/A1A2A.qry b/data/queries/heteroatoms/A1A2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A2A.qry rename to data/queries/heteroatoms/A1A2A.qry diff --git a/contrib/data/queries/heteroatoms/A1A2D.qry b/data/queries/heteroatoms/A1A2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A2D.qry rename to data/queries/heteroatoms/A1A2D.qry diff --git a/contrib/data/queries/heteroatoms/A1A3A.qry b/data/queries/heteroatoms/A1A3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A3A.qry rename to data/queries/heteroatoms/A1A3A.qry diff --git a/contrib/data/queries/heteroatoms/A1A3D.qry b/data/queries/heteroatoms/A1A3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A3D.qry rename to data/queries/heteroatoms/A1A3D.qry diff --git a/contrib/data/queries/heteroatoms/A1A4A.qry b/data/queries/heteroatoms/A1A4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A4A.qry rename to data/queries/heteroatoms/A1A4A.qry diff --git a/contrib/data/queries/heteroatoms/A1A4D.qry b/data/queries/heteroatoms/A1A4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1A4D.qry rename to data/queries/heteroatoms/A1A4D.qry diff --git a/contrib/data/queries/heteroatoms/A1B1AE1A.qry b/data/queries/heteroatoms/A1B1AE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B1AE1A.qry rename to data/queries/heteroatoms/A1B1AE1A.qry diff --git a/contrib/data/queries/heteroatoms/A1B1AEA.qry b/data/queries/heteroatoms/A1B1AEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B1AEA.qry rename to data/queries/heteroatoms/A1B1AEA.qry diff --git a/contrib/data/queries/heteroatoms/A1B1AED.qry b/data/queries/heteroatoms/A1B1AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B1AED.qry rename to data/queries/heteroatoms/A1B1AED.qry diff --git a/contrib/data/queries/heteroatoms/A1B1DE1A.qry b/data/queries/heteroatoms/A1B1DE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B1DE1A.qry rename to data/queries/heteroatoms/A1B1DE1A.qry diff --git a/contrib/data/queries/heteroatoms/A1B1DE1D.qry b/data/queries/heteroatoms/A1B1DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B1DE1D.qry rename to data/queries/heteroatoms/A1B1DE1D.qry diff --git a/contrib/data/queries/heteroatoms/A1B1DEA.qry b/data/queries/heteroatoms/A1B1DEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B1DEA.qry rename to data/queries/heteroatoms/A1B1DEA.qry diff --git a/contrib/data/queries/heteroatoms/A1B1DED.qry b/data/queries/heteroatoms/A1B1DED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B1DED.qry rename to data/queries/heteroatoms/A1B1DED.qry diff --git a/contrib/data/queries/heteroatoms/A1B2AE1A.qry b/data/queries/heteroatoms/A1B2AE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2AE1A.qry rename to data/queries/heteroatoms/A1B2AE1A.qry diff --git a/contrib/data/queries/heteroatoms/A1B2AE1D.qry b/data/queries/heteroatoms/A1B2AE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2AE1D.qry rename to data/queries/heteroatoms/A1B2AE1D.qry diff --git a/contrib/data/queries/heteroatoms/A1B2AE2A.qry b/data/queries/heteroatoms/A1B2AE2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2AE2A.qry rename to data/queries/heteroatoms/A1B2AE2A.qry diff --git a/contrib/data/queries/heteroatoms/A1B2AEA.qry b/data/queries/heteroatoms/A1B2AEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2AEA.qry rename to data/queries/heteroatoms/A1B2AEA.qry diff --git a/contrib/data/queries/heteroatoms/A1B2AED.qry b/data/queries/heteroatoms/A1B2AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2AED.qry rename to data/queries/heteroatoms/A1B2AED.qry diff --git a/contrib/data/queries/heteroatoms/A1B2DE1A.qry b/data/queries/heteroatoms/A1B2DE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2DE1A.qry rename to data/queries/heteroatoms/A1B2DE1A.qry diff --git a/contrib/data/queries/heteroatoms/A1B2DE1D.qry b/data/queries/heteroatoms/A1B2DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2DE1D.qry rename to data/queries/heteroatoms/A1B2DE1D.qry diff --git a/contrib/data/queries/heteroatoms/A1B2DE2A.qry b/data/queries/heteroatoms/A1B2DE2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2DE2A.qry rename to data/queries/heteroatoms/A1B2DE2A.qry diff --git a/contrib/data/queries/heteroatoms/A1B2DE2D.qry b/data/queries/heteroatoms/A1B2DE2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2DE2D.qry rename to data/queries/heteroatoms/A1B2DE2D.qry diff --git a/contrib/data/queries/heteroatoms/A1B2DEA.qry b/data/queries/heteroatoms/A1B2DEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2DEA.qry rename to data/queries/heteroatoms/A1B2DEA.qry diff --git a/contrib/data/queries/heteroatoms/A1B2DED.qry b/data/queries/heteroatoms/A1B2DED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B2DED.qry rename to data/queries/heteroatoms/A1B2DED.qry diff --git a/contrib/data/queries/heteroatoms/A1B3AE1A.qry b/data/queries/heteroatoms/A1B3AE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3AE1A.qry rename to data/queries/heteroatoms/A1B3AE1A.qry diff --git a/contrib/data/queries/heteroatoms/A1B3AE1D.qry b/data/queries/heteroatoms/A1B3AE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3AE1D.qry rename to data/queries/heteroatoms/A1B3AE1D.qry diff --git a/contrib/data/queries/heteroatoms/A1B3AE3A.qry b/data/queries/heteroatoms/A1B3AE3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3AE3A.qry rename to data/queries/heteroatoms/A1B3AE3A.qry diff --git a/contrib/data/queries/heteroatoms/A1B3AEA.qry b/data/queries/heteroatoms/A1B3AEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3AEA.qry rename to data/queries/heteroatoms/A1B3AEA.qry diff --git a/contrib/data/queries/heteroatoms/A1B3AED.qry b/data/queries/heteroatoms/A1B3AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3AED.qry rename to data/queries/heteroatoms/A1B3AED.qry diff --git a/contrib/data/queries/heteroatoms/A1B3DE1A.qry b/data/queries/heteroatoms/A1B3DE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3DE1A.qry rename to data/queries/heteroatoms/A1B3DE1A.qry diff --git a/contrib/data/queries/heteroatoms/A1B3DE1D.qry b/data/queries/heteroatoms/A1B3DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3DE1D.qry rename to data/queries/heteroatoms/A1B3DE1D.qry diff --git a/contrib/data/queries/heteroatoms/A1B3DE3A.qry b/data/queries/heteroatoms/A1B3DE3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3DE3A.qry rename to data/queries/heteroatoms/A1B3DE3A.qry diff --git a/contrib/data/queries/heteroatoms/A1B3DEA.qry b/data/queries/heteroatoms/A1B3DEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3DEA.qry rename to data/queries/heteroatoms/A1B3DEA.qry diff --git a/contrib/data/queries/heteroatoms/A1B3DED.qry b/data/queries/heteroatoms/A1B3DED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B3DED.qry rename to data/queries/heteroatoms/A1B3DED.qry diff --git a/contrib/data/queries/heteroatoms/A1B4AEA.qry b/data/queries/heteroatoms/A1B4AEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B4AEA.qry rename to data/queries/heteroatoms/A1B4AEA.qry diff --git a/contrib/data/queries/heteroatoms/A1B4AED.qry b/data/queries/heteroatoms/A1B4AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B4AED.qry rename to data/queries/heteroatoms/A1B4AED.qry diff --git a/contrib/data/queries/heteroatoms/A1B4DEA.qry b/data/queries/heteroatoms/A1B4DEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B4DEA.qry rename to data/queries/heteroatoms/A1B4DEA.qry diff --git a/contrib/data/queries/heteroatoms/A1B4DED.qry b/data/queries/heteroatoms/A1B4DED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B4DED.qry rename to data/queries/heteroatoms/A1B4DED.qry diff --git a/contrib/data/queries/heteroatoms/A1B6AED.qry b/data/queries/heteroatoms/A1B6AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1B6AED.qry rename to data/queries/heteroatoms/A1B6AED.qry diff --git a/contrib/data/queries/heteroatoms/A1BAEA.qry b/data/queries/heteroatoms/A1BAEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1BAEA.qry rename to data/queries/heteroatoms/A1BAEA.qry diff --git a/contrib/data/queries/heteroatoms/A1BDEA.qry b/data/queries/heteroatoms/A1BDEA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1BDEA.qry rename to data/queries/heteroatoms/A1BDEA.qry diff --git a/contrib/data/queries/heteroatoms/A1BDED.qry b/data/queries/heteroatoms/A1BDED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1BDED.qry rename to data/queries/heteroatoms/A1BDED.qry diff --git a/contrib/data/queries/heteroatoms/A1D.qry b/data/queries/heteroatoms/A1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D.qry rename to data/queries/heteroatoms/A1D.qry diff --git a/contrib/data/queries/heteroatoms/A1D1A.qry b/data/queries/heteroatoms/A1D1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D1A.qry rename to data/queries/heteroatoms/A1D1A.qry diff --git a/contrib/data/queries/heteroatoms/A1D1D.qry b/data/queries/heteroatoms/A1D1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D1D.qry rename to data/queries/heteroatoms/A1D1D.qry diff --git a/contrib/data/queries/heteroatoms/A1D2A.qry b/data/queries/heteroatoms/A1D2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D2A.qry rename to data/queries/heteroatoms/A1D2A.qry diff --git a/contrib/data/queries/heteroatoms/A1D2D.qry b/data/queries/heteroatoms/A1D2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D2D.qry rename to data/queries/heteroatoms/A1D2D.qry diff --git a/contrib/data/queries/heteroatoms/A1D3A.qry b/data/queries/heteroatoms/A1D3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D3A.qry rename to data/queries/heteroatoms/A1D3A.qry diff --git a/contrib/data/queries/heteroatoms/A1D3D.qry b/data/queries/heteroatoms/A1D3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D3D.qry rename to data/queries/heteroatoms/A1D3D.qry diff --git a/contrib/data/queries/heteroatoms/A1D4A.qry b/data/queries/heteroatoms/A1D4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D4A.qry rename to data/queries/heteroatoms/A1D4A.qry diff --git a/contrib/data/queries/heteroatoms/A1D4D.qry b/data/queries/heteroatoms/A1D4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D4D.qry rename to data/queries/heteroatoms/A1D4D.qry diff --git a/contrib/data/queries/heteroatoms/A1D5A.qry b/data/queries/heteroatoms/A1D5A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D5A.qry rename to data/queries/heteroatoms/A1D5A.qry diff --git a/contrib/data/queries/heteroatoms/A1D5D.qry b/data/queries/heteroatoms/A1D5D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A1D5D.qry rename to data/queries/heteroatoms/A1D5D.qry diff --git a/contrib/data/queries/heteroatoms/A2A.qry b/data/queries/heteroatoms/A2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2A.qry rename to data/queries/heteroatoms/A2A.qry diff --git a/contrib/data/queries/heteroatoms/A2A2A.qry b/data/queries/heteroatoms/A2A2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2A2A.qry rename to data/queries/heteroatoms/A2A2A.qry diff --git a/contrib/data/queries/heteroatoms/A2A2D.qry b/data/queries/heteroatoms/A2A2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2A2D.qry rename to data/queries/heteroatoms/A2A2D.qry diff --git a/contrib/data/queries/heteroatoms/A2A3A.qry b/data/queries/heteroatoms/A2A3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2A3A.qry rename to data/queries/heteroatoms/A2A3A.qry diff --git a/contrib/data/queries/heteroatoms/A2A3D.qry b/data/queries/heteroatoms/A2A3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2A3D.qry rename to data/queries/heteroatoms/A2A3D.qry diff --git a/contrib/data/queries/heteroatoms/A2B1AE1A.qry b/data/queries/heteroatoms/A2B1AE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2B1AE1A.qry rename to data/queries/heteroatoms/A2B1AE1A.qry diff --git a/contrib/data/queries/heteroatoms/A2B1DE1A.qry b/data/queries/heteroatoms/A2B1DE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2B1DE1A.qry rename to data/queries/heteroatoms/A2B1DE1A.qry diff --git a/contrib/data/queries/heteroatoms/A2B1DE1D.qry b/data/queries/heteroatoms/A2B1DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2B1DE1D.qry rename to data/queries/heteroatoms/A2B1DE1D.qry diff --git a/contrib/data/queries/heteroatoms/A2B2AE1A.qry b/data/queries/heteroatoms/A2B2AE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2B2AE1A.qry rename to data/queries/heteroatoms/A2B2AE1A.qry diff --git a/contrib/data/queries/heteroatoms/A2B2AE1D.qry b/data/queries/heteroatoms/A2B2AE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2B2AE1D.qry rename to data/queries/heteroatoms/A2B2AE1D.qry diff --git a/contrib/data/queries/heteroatoms/A2B2DE1A.qry b/data/queries/heteroatoms/A2B2DE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2B2DE1A.qry rename to data/queries/heteroatoms/A2B2DE1A.qry diff --git a/contrib/data/queries/heteroatoms/A2B2DE1D.qry b/data/queries/heteroatoms/A2B2DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2B2DE1D.qry rename to data/queries/heteroatoms/A2B2DE1D.qry diff --git a/contrib/data/queries/heteroatoms/A2D.qry b/data/queries/heteroatoms/A2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2D.qry rename to data/queries/heteroatoms/A2D.qry diff --git a/contrib/data/queries/heteroatoms/A2D2A.qry b/data/queries/heteroatoms/A2D2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2D2A.qry rename to data/queries/heteroatoms/A2D2A.qry diff --git a/contrib/data/queries/heteroatoms/A2D2D.qry b/data/queries/heteroatoms/A2D2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2D2D.qry rename to data/queries/heteroatoms/A2D2D.qry diff --git a/contrib/data/queries/heteroatoms/A2D3A.qry b/data/queries/heteroatoms/A2D3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2D3A.qry rename to data/queries/heteroatoms/A2D3A.qry diff --git a/contrib/data/queries/heteroatoms/A2D3D.qry b/data/queries/heteroatoms/A2D3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2D3D.qry rename to data/queries/heteroatoms/A2D3D.qry diff --git a/contrib/data/queries/heteroatoms/A2D4A.qry b/data/queries/heteroatoms/A2D4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A2D4A.qry rename to data/queries/heteroatoms/A2D4A.qry diff --git a/contrib/data/queries/heteroatoms/A3A.qry b/data/queries/heteroatoms/A3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A3A.qry rename to data/queries/heteroatoms/A3A.qry diff --git a/contrib/data/queries/heteroatoms/A3A3A.qry b/data/queries/heteroatoms/A3A3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A3A3A.qry rename to data/queries/heteroatoms/A3A3A.qry diff --git a/contrib/data/queries/heteroatoms/A3A3D.qry b/data/queries/heteroatoms/A3A3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A3A3D.qry rename to data/queries/heteroatoms/A3A3D.qry diff --git a/contrib/data/queries/heteroatoms/A3D.qry b/data/queries/heteroatoms/A3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A3D.qry rename to data/queries/heteroatoms/A3D.qry diff --git a/contrib/data/queries/heteroatoms/A4A.qry b/data/queries/heteroatoms/A4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A4A.qry rename to data/queries/heteroatoms/A4A.qry diff --git a/contrib/data/queries/heteroatoms/A4D.qry b/data/queries/heteroatoms/A4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A4D.qry rename to data/queries/heteroatoms/A4D.qry diff --git a/contrib/data/queries/heteroatoms/A5A.qry b/data/queries/heteroatoms/A5A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A5A.qry rename to data/queries/heteroatoms/A5A.qry diff --git a/contrib/data/queries/heteroatoms/A5D.qry b/data/queries/heteroatoms/A5D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A5D.qry rename to data/queries/heteroatoms/A5D.qry diff --git a/contrib/data/queries/heteroatoms/A6A.qry b/data/queries/heteroatoms/A6A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A6A.qry rename to data/queries/heteroatoms/A6A.qry diff --git a/contrib/data/queries/heteroatoms/A6D.qry b/data/queries/heteroatoms/A6D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A6D.qry rename to data/queries/heteroatoms/A6D.qry diff --git a/contrib/data/queries/heteroatoms/A7A.qry b/data/queries/heteroatoms/A7A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/A7A.qry rename to data/queries/heteroatoms/A7A.qry diff --git a/contrib/data/queries/heteroatoms/AA.qry b/data/queries/heteroatoms/AA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA.qry rename to data/queries/heteroatoms/AA.qry diff --git a/contrib/data/queries/heteroatoms/AA1A.qry b/data/queries/heteroatoms/AA1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA1A.qry rename to data/queries/heteroatoms/AA1A.qry diff --git a/contrib/data/queries/heteroatoms/AA1D.qry b/data/queries/heteroatoms/AA1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA1D.qry rename to data/queries/heteroatoms/AA1D.qry diff --git a/contrib/data/queries/heteroatoms/AA2A.qry b/data/queries/heteroatoms/AA2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA2A.qry rename to data/queries/heteroatoms/AA2A.qry diff --git a/contrib/data/queries/heteroatoms/AA2D.qry b/data/queries/heteroatoms/AA2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA2D.qry rename to data/queries/heteroatoms/AA2D.qry diff --git a/contrib/data/queries/heteroatoms/AA3A.qry b/data/queries/heteroatoms/AA3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA3A.qry rename to data/queries/heteroatoms/AA3A.qry diff --git a/contrib/data/queries/heteroatoms/AA3D.qry b/data/queries/heteroatoms/AA3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA3D.qry rename to data/queries/heteroatoms/AA3D.qry diff --git a/contrib/data/queries/heteroatoms/AA4A.qry b/data/queries/heteroatoms/AA4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA4A.qry rename to data/queries/heteroatoms/AA4A.qry diff --git a/contrib/data/queries/heteroatoms/AA4D.qry b/data/queries/heteroatoms/AA4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA4D.qry rename to data/queries/heteroatoms/AA4D.qry diff --git a/contrib/data/queries/heteroatoms/AA5A.qry b/data/queries/heteroatoms/AA5A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA5A.qry rename to data/queries/heteroatoms/AA5A.qry diff --git a/contrib/data/queries/heteroatoms/AA5D.qry b/data/queries/heteroatoms/AA5D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AA5D.qry rename to data/queries/heteroatoms/AA5D.qry diff --git a/contrib/data/queries/heteroatoms/AAA.qry b/data/queries/heteroatoms/AAA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AAA.qry rename to data/queries/heteroatoms/AAA.qry diff --git a/contrib/data/queries/heteroatoms/AAD.qry b/data/queries/heteroatoms/AAD.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AAD.qry rename to data/queries/heteroatoms/AAD.qry diff --git a/contrib/data/queries/heteroatoms/AD.qry b/data/queries/heteroatoms/AD.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD.qry rename to data/queries/heteroatoms/AD.qry diff --git a/contrib/data/queries/heteroatoms/AD1A.qry b/data/queries/heteroatoms/AD1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD1A.qry rename to data/queries/heteroatoms/AD1A.qry diff --git a/contrib/data/queries/heteroatoms/AD1D.qry b/data/queries/heteroatoms/AD1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD1D.qry rename to data/queries/heteroatoms/AD1D.qry diff --git a/contrib/data/queries/heteroatoms/AD2A.qry b/data/queries/heteroatoms/AD2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD2A.qry rename to data/queries/heteroatoms/AD2A.qry diff --git a/contrib/data/queries/heteroatoms/AD2D.qry b/data/queries/heteroatoms/AD2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD2D.qry rename to data/queries/heteroatoms/AD2D.qry diff --git a/contrib/data/queries/heteroatoms/AD3A.qry b/data/queries/heteroatoms/AD3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD3A.qry rename to data/queries/heteroatoms/AD3A.qry diff --git a/contrib/data/queries/heteroatoms/AD3D.qry b/data/queries/heteroatoms/AD3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD3D.qry rename to data/queries/heteroatoms/AD3D.qry diff --git a/contrib/data/queries/heteroatoms/AD4A.qry b/data/queries/heteroatoms/AD4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD4A.qry rename to data/queries/heteroatoms/AD4A.qry diff --git a/contrib/data/queries/heteroatoms/AD4D.qry b/data/queries/heteroatoms/AD4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD4D.qry rename to data/queries/heteroatoms/AD4D.qry diff --git a/contrib/data/queries/heteroatoms/AD5A.qry b/data/queries/heteroatoms/AD5A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD5A.qry rename to data/queries/heteroatoms/AD5A.qry diff --git a/contrib/data/queries/heteroatoms/AD5D.qry b/data/queries/heteroatoms/AD5D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/AD5D.qry rename to data/queries/heteroatoms/AD5D.qry diff --git a/contrib/data/queries/heteroatoms/ADA.qry b/data/queries/heteroatoms/ADA.qry similarity index 100% rename from contrib/data/queries/heteroatoms/ADA.qry rename to data/queries/heteroatoms/ADA.qry diff --git a/contrib/data/queries/heteroatoms/ADD.qry b/data/queries/heteroatoms/ADD.qry similarity index 100% rename from contrib/data/queries/heteroatoms/ADD.qry rename to data/queries/heteroatoms/ADD.qry diff --git a/contrib/data/queries/heteroatoms/D.qry b/data/queries/heteroatoms/D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D.qry rename to data/queries/heteroatoms/D.qry diff --git a/contrib/data/queries/heteroatoms/D1A1D.qry b/data/queries/heteroatoms/D1A1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1A1D.qry rename to data/queries/heteroatoms/D1A1D.qry diff --git a/contrib/data/queries/heteroatoms/D1A2A.qry b/data/queries/heteroatoms/D1A2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1A2A.qry rename to data/queries/heteroatoms/D1A2A.qry diff --git a/contrib/data/queries/heteroatoms/D1A2D.qry b/data/queries/heteroatoms/D1A2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1A2D.qry rename to data/queries/heteroatoms/D1A2D.qry diff --git a/contrib/data/queries/heteroatoms/D1A3A.qry b/data/queries/heteroatoms/D1A3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1A3A.qry rename to data/queries/heteroatoms/D1A3A.qry diff --git a/contrib/data/queries/heteroatoms/D1A3D.qry b/data/queries/heteroatoms/D1A3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1A3D.qry rename to data/queries/heteroatoms/D1A3D.qry diff --git a/contrib/data/queries/heteroatoms/D1A4A.qry b/data/queries/heteroatoms/D1A4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1A4A.qry rename to data/queries/heteroatoms/D1A4A.qry diff --git a/contrib/data/queries/heteroatoms/D1A4D.qry b/data/queries/heteroatoms/D1A4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1A4D.qry rename to data/queries/heteroatoms/D1A4D.qry diff --git a/contrib/data/queries/heteroatoms/D1B1AE1A.qry b/data/queries/heteroatoms/D1B1AE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B1AE1A.qry rename to data/queries/heteroatoms/D1B1AE1A.qry diff --git a/contrib/data/queries/heteroatoms/D1B1AED.qry b/data/queries/heteroatoms/D1B1AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B1AED.qry rename to data/queries/heteroatoms/D1B1AED.qry diff --git a/contrib/data/queries/heteroatoms/D1B1DE1A.qry b/data/queries/heteroatoms/D1B1DE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B1DE1A.qry rename to data/queries/heteroatoms/D1B1DE1A.qry diff --git a/contrib/data/queries/heteroatoms/D1B1DE1D.qry b/data/queries/heteroatoms/D1B1DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B1DE1D.qry rename to data/queries/heteroatoms/D1B1DE1D.qry diff --git a/contrib/data/queries/heteroatoms/D1B1DED.qry b/data/queries/heteroatoms/D1B1DED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B1DED.qry rename to data/queries/heteroatoms/D1B1DED.qry diff --git a/contrib/data/queries/heteroatoms/D1B2AE1A.qry b/data/queries/heteroatoms/D1B2AE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2AE1A.qry rename to data/queries/heteroatoms/D1B2AE1A.qry diff --git a/contrib/data/queries/heteroatoms/D1B2AE1D.qry b/data/queries/heteroatoms/D1B2AE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2AE1D.qry rename to data/queries/heteroatoms/D1B2AE1D.qry diff --git a/contrib/data/queries/heteroatoms/D1B2AE2A.qry b/data/queries/heteroatoms/D1B2AE2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2AE2A.qry rename to data/queries/heteroatoms/D1B2AE2A.qry diff --git a/contrib/data/queries/heteroatoms/D1B2AED.qry b/data/queries/heteroatoms/D1B2AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2AED.qry rename to data/queries/heteroatoms/D1B2AED.qry diff --git a/contrib/data/queries/heteroatoms/D1B2DE1A.qry b/data/queries/heteroatoms/D1B2DE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2DE1A.qry rename to data/queries/heteroatoms/D1B2DE1A.qry diff --git a/contrib/data/queries/heteroatoms/D1B2DE1D.qry b/data/queries/heteroatoms/D1B2DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2DE1D.qry rename to data/queries/heteroatoms/D1B2DE1D.qry diff --git a/contrib/data/queries/heteroatoms/D1B2DE2A.qry b/data/queries/heteroatoms/D1B2DE2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2DE2A.qry rename to data/queries/heteroatoms/D1B2DE2A.qry diff --git a/contrib/data/queries/heteroatoms/D1B2DE2D.qry b/data/queries/heteroatoms/D1B2DE2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2DE2D.qry rename to data/queries/heteroatoms/D1B2DE2D.qry diff --git a/contrib/data/queries/heteroatoms/D1B2DED.qry b/data/queries/heteroatoms/D1B2DED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B2DED.qry rename to data/queries/heteroatoms/D1B2DED.qry diff --git a/contrib/data/queries/heteroatoms/D1B3AE1A.qry b/data/queries/heteroatoms/D1B3AE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B3AE1A.qry rename to data/queries/heteroatoms/D1B3AE1A.qry diff --git a/contrib/data/queries/heteroatoms/D1B3AE1D.qry b/data/queries/heteroatoms/D1B3AE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B3AE1D.qry rename to data/queries/heteroatoms/D1B3AE1D.qry diff --git a/contrib/data/queries/heteroatoms/D1B3AED.qry b/data/queries/heteroatoms/D1B3AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B3AED.qry rename to data/queries/heteroatoms/D1B3AED.qry diff --git a/contrib/data/queries/heteroatoms/D1B3DE1A.qry b/data/queries/heteroatoms/D1B3DE1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B3DE1A.qry rename to data/queries/heteroatoms/D1B3DE1A.qry diff --git a/contrib/data/queries/heteroatoms/D1B3DE1D.qry b/data/queries/heteroatoms/D1B3DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B3DE1D.qry rename to data/queries/heteroatoms/D1B3DE1D.qry diff --git a/contrib/data/queries/heteroatoms/D1B3DED.qry b/data/queries/heteroatoms/D1B3DED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B3DED.qry rename to data/queries/heteroatoms/D1B3DED.qry diff --git a/contrib/data/queries/heteroatoms/D1B4AED.qry b/data/queries/heteroatoms/D1B4AED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B4AED.qry rename to data/queries/heteroatoms/D1B4AED.qry diff --git a/contrib/data/queries/heteroatoms/D1B4DED.qry b/data/queries/heteroatoms/D1B4DED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1B4DED.qry rename to data/queries/heteroatoms/D1B4DED.qry diff --git a/contrib/data/queries/heteroatoms/D1BDED.qry b/data/queries/heteroatoms/D1BDED.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1BDED.qry rename to data/queries/heteroatoms/D1BDED.qry diff --git a/contrib/data/queries/heteroatoms/D1D.qry b/data/queries/heteroatoms/D1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1D.qry rename to data/queries/heteroatoms/D1D.qry diff --git a/contrib/data/queries/heteroatoms/D1D1D.qry b/data/queries/heteroatoms/D1D1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1D1D.qry rename to data/queries/heteroatoms/D1D1D.qry diff --git a/contrib/data/queries/heteroatoms/D1D2A.qry b/data/queries/heteroatoms/D1D2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1D2A.qry rename to data/queries/heteroatoms/D1D2A.qry diff --git a/contrib/data/queries/heteroatoms/D1D2D.qry b/data/queries/heteroatoms/D1D2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1D2D.qry rename to data/queries/heteroatoms/D1D2D.qry diff --git a/contrib/data/queries/heteroatoms/D1D3A.qry b/data/queries/heteroatoms/D1D3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1D3A.qry rename to data/queries/heteroatoms/D1D3A.qry diff --git a/contrib/data/queries/heteroatoms/D1D3D.qry b/data/queries/heteroatoms/D1D3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1D3D.qry rename to data/queries/heteroatoms/D1D3D.qry diff --git a/contrib/data/queries/heteroatoms/D1D4A.qry b/data/queries/heteroatoms/D1D4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1D4A.qry rename to data/queries/heteroatoms/D1D4A.qry diff --git a/contrib/data/queries/heteroatoms/D1D4D.qry b/data/queries/heteroatoms/D1D4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D1D4D.qry rename to data/queries/heteroatoms/D1D4D.qry diff --git a/contrib/data/queries/heteroatoms/D2A2D.qry b/data/queries/heteroatoms/D2A2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2A2D.qry rename to data/queries/heteroatoms/D2A2D.qry diff --git a/contrib/data/queries/heteroatoms/D2A3A.qry b/data/queries/heteroatoms/D2A3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2A3A.qry rename to data/queries/heteroatoms/D2A3A.qry diff --git a/contrib/data/queries/heteroatoms/D2A3D.qry b/data/queries/heteroatoms/D2A3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2A3D.qry rename to data/queries/heteroatoms/D2A3D.qry diff --git a/contrib/data/queries/heteroatoms/D2B1DE1D.qry b/data/queries/heteroatoms/D2B1DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2B1DE1D.qry rename to data/queries/heteroatoms/D2B1DE1D.qry diff --git a/contrib/data/queries/heteroatoms/D2B2AE1D.qry b/data/queries/heteroatoms/D2B2AE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2B2AE1D.qry rename to data/queries/heteroatoms/D2B2AE1D.qry diff --git a/contrib/data/queries/heteroatoms/D2B2DE1D.qry b/data/queries/heteroatoms/D2B2DE1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2B2DE1D.qry rename to data/queries/heteroatoms/D2B2DE1D.qry diff --git a/contrib/data/queries/heteroatoms/D2D.qry b/data/queries/heteroatoms/D2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2D.qry rename to data/queries/heteroatoms/D2D.qry diff --git a/contrib/data/queries/heteroatoms/D2D2D.qry b/data/queries/heteroatoms/D2D2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2D2D.qry rename to data/queries/heteroatoms/D2D2D.qry diff --git a/contrib/data/queries/heteroatoms/D2D3A.qry b/data/queries/heteroatoms/D2D3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2D3A.qry rename to data/queries/heteroatoms/D2D3A.qry diff --git a/contrib/data/queries/heteroatoms/D2D3D.qry b/data/queries/heteroatoms/D2D3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2D3D.qry rename to data/queries/heteroatoms/D2D3D.qry diff --git a/contrib/data/queries/heteroatoms/D2D4A.qry b/data/queries/heteroatoms/D2D4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D2D4A.qry rename to data/queries/heteroatoms/D2D4A.qry diff --git a/contrib/data/queries/heteroatoms/D3D.qry b/data/queries/heteroatoms/D3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D3D.qry rename to data/queries/heteroatoms/D3D.qry diff --git a/contrib/data/queries/heteroatoms/D4D.qry b/data/queries/heteroatoms/D4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D4D.qry rename to data/queries/heteroatoms/D4D.qry diff --git a/contrib/data/queries/heteroatoms/D5D.qry b/data/queries/heteroatoms/D5D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D5D.qry rename to data/queries/heteroatoms/D5D.qry diff --git a/contrib/data/queries/heteroatoms/D6D.qry b/data/queries/heteroatoms/D6D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/D6D.qry rename to data/queries/heteroatoms/D6D.qry diff --git a/contrib/data/queries/heteroatoms/DA1A.qry b/data/queries/heteroatoms/DA1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA1A.qry rename to data/queries/heteroatoms/DA1A.qry diff --git a/contrib/data/queries/heteroatoms/DA1D.qry b/data/queries/heteroatoms/DA1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA1D.qry rename to data/queries/heteroatoms/DA1D.qry diff --git a/contrib/data/queries/heteroatoms/DA2A.qry b/data/queries/heteroatoms/DA2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA2A.qry rename to data/queries/heteroatoms/DA2A.qry diff --git a/contrib/data/queries/heteroatoms/DA2D.qry b/data/queries/heteroatoms/DA2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA2D.qry rename to data/queries/heteroatoms/DA2D.qry diff --git a/contrib/data/queries/heteroatoms/DA3A.qry b/data/queries/heteroatoms/DA3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA3A.qry rename to data/queries/heteroatoms/DA3A.qry diff --git a/contrib/data/queries/heteroatoms/DA3D.qry b/data/queries/heteroatoms/DA3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA3D.qry rename to data/queries/heteroatoms/DA3D.qry diff --git a/contrib/data/queries/heteroatoms/DA4A.qry b/data/queries/heteroatoms/DA4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA4A.qry rename to data/queries/heteroatoms/DA4A.qry diff --git a/contrib/data/queries/heteroatoms/DA4D.qry b/data/queries/heteroatoms/DA4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA4D.qry rename to data/queries/heteroatoms/DA4D.qry diff --git a/contrib/data/queries/heteroatoms/DA5A.qry b/data/queries/heteroatoms/DA5A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA5A.qry rename to data/queries/heteroatoms/DA5A.qry diff --git a/contrib/data/queries/heteroatoms/DA5D.qry b/data/queries/heteroatoms/DA5D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DA5D.qry rename to data/queries/heteroatoms/DA5D.qry diff --git a/contrib/data/queries/heteroatoms/DAD.qry b/data/queries/heteroatoms/DAD.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DAD.qry rename to data/queries/heteroatoms/DAD.qry diff --git a/contrib/data/queries/heteroatoms/DD.qry b/data/queries/heteroatoms/DD.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD.qry rename to data/queries/heteroatoms/DD.qry diff --git a/contrib/data/queries/heteroatoms/DD1A.qry b/data/queries/heteroatoms/DD1A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD1A.qry rename to data/queries/heteroatoms/DD1A.qry diff --git a/contrib/data/queries/heteroatoms/DD1D.qry b/data/queries/heteroatoms/DD1D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD1D.qry rename to data/queries/heteroatoms/DD1D.qry diff --git a/contrib/data/queries/heteroatoms/DD2A.qry b/data/queries/heteroatoms/DD2A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD2A.qry rename to data/queries/heteroatoms/DD2A.qry diff --git a/contrib/data/queries/heteroatoms/DD2D.qry b/data/queries/heteroatoms/DD2D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD2D.qry rename to data/queries/heteroatoms/DD2D.qry diff --git a/contrib/data/queries/heteroatoms/DD3A.qry b/data/queries/heteroatoms/DD3A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD3A.qry rename to data/queries/heteroatoms/DD3A.qry diff --git a/contrib/data/queries/heteroatoms/DD3D.qry b/data/queries/heteroatoms/DD3D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD3D.qry rename to data/queries/heteroatoms/DD3D.qry diff --git a/contrib/data/queries/heteroatoms/DD4A.qry b/data/queries/heteroatoms/DD4A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD4A.qry rename to data/queries/heteroatoms/DD4A.qry diff --git a/contrib/data/queries/heteroatoms/DD4D.qry b/data/queries/heteroatoms/DD4D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD4D.qry rename to data/queries/heteroatoms/DD4D.qry diff --git a/contrib/data/queries/heteroatoms/DD5A.qry b/data/queries/heteroatoms/DD5A.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD5A.qry rename to data/queries/heteroatoms/DD5A.qry diff --git a/contrib/data/queries/heteroatoms/DD5D.qry b/data/queries/heteroatoms/DD5D.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DD5D.qry rename to data/queries/heteroatoms/DD5D.qry diff --git a/contrib/data/queries/heteroatoms/DDD.qry b/data/queries/heteroatoms/DDD.qry similarity index 100% rename from contrib/data/queries/heteroatoms/DDD.qry rename to data/queries/heteroatoms/DDD.qry diff --git a/contrib/data/queries/heteroatoms/counta1.qry b/data/queries/heteroatoms/counta1.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta1.qry rename to data/queries/heteroatoms/counta1.qry diff --git a/contrib/data/queries/heteroatoms/counta10.qry b/data/queries/heteroatoms/counta10.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta10.qry rename to data/queries/heteroatoms/counta10.qry diff --git a/contrib/data/queries/heteroatoms/counta2.qry b/data/queries/heteroatoms/counta2.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta2.qry rename to data/queries/heteroatoms/counta2.qry diff --git a/contrib/data/queries/heteroatoms/counta3.qry b/data/queries/heteroatoms/counta3.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta3.qry rename to data/queries/heteroatoms/counta3.qry diff --git a/contrib/data/queries/heteroatoms/counta4.qry b/data/queries/heteroatoms/counta4.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta4.qry rename to data/queries/heteroatoms/counta4.qry diff --git a/contrib/data/queries/heteroatoms/counta5.qry b/data/queries/heteroatoms/counta5.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta5.qry rename to data/queries/heteroatoms/counta5.qry diff --git a/contrib/data/queries/heteroatoms/counta6.qry b/data/queries/heteroatoms/counta6.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta6.qry rename to data/queries/heteroatoms/counta6.qry diff --git a/contrib/data/queries/heteroatoms/counta7.qry b/data/queries/heteroatoms/counta7.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta7.qry rename to data/queries/heteroatoms/counta7.qry diff --git a/contrib/data/queries/heteroatoms/counta8.qry b/data/queries/heteroatoms/counta8.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta8.qry rename to data/queries/heteroatoms/counta8.qry diff --git a/contrib/data/queries/heteroatoms/counta9.qry b/data/queries/heteroatoms/counta9.qry similarity index 100% rename from contrib/data/queries/heteroatoms/counta9.qry rename to data/queries/heteroatoms/counta9.qry diff --git a/contrib/data/queries/heteroatoms/countd1.qry b/data/queries/heteroatoms/countd1.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd1.qry rename to data/queries/heteroatoms/countd1.qry diff --git a/contrib/data/queries/heteroatoms/countd10.qry b/data/queries/heteroatoms/countd10.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd10.qry rename to data/queries/heteroatoms/countd10.qry diff --git a/contrib/data/queries/heteroatoms/countd2.qry b/data/queries/heteroatoms/countd2.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd2.qry rename to data/queries/heteroatoms/countd2.qry diff --git a/contrib/data/queries/heteroatoms/countd3.qry b/data/queries/heteroatoms/countd3.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd3.qry rename to data/queries/heteroatoms/countd3.qry diff --git a/contrib/data/queries/heteroatoms/countd4.qry b/data/queries/heteroatoms/countd4.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd4.qry rename to data/queries/heteroatoms/countd4.qry diff --git a/contrib/data/queries/heteroatoms/countd5.qry b/data/queries/heteroatoms/countd5.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd5.qry rename to data/queries/heteroatoms/countd5.qry diff --git a/contrib/data/queries/heteroatoms/countd6.qry b/data/queries/heteroatoms/countd6.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd6.qry rename to data/queries/heteroatoms/countd6.qry diff --git a/contrib/data/queries/heteroatoms/countd7.qry b/data/queries/heteroatoms/countd7.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd7.qry rename to data/queries/heteroatoms/countd7.qry diff --git a/contrib/data/queries/heteroatoms/countd8.qry b/data/queries/heteroatoms/countd8.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd8.qry rename to data/queries/heteroatoms/countd8.qry diff --git a/contrib/data/queries/heteroatoms/countd9.qry b/data/queries/heteroatoms/countd9.qry similarity index 100% rename from contrib/data/queries/heteroatoms/countd9.qry rename to data/queries/heteroatoms/countd9.qry diff --git a/contrib/data/queries/heteroatoms/unique_queries_tnass b/data/queries/heteroatoms/unique_queries_tnass similarity index 100% rename from contrib/data/queries/heteroatoms/unique_queries_tnass rename to data/queries/heteroatoms/unique_queries_tnass diff --git a/contrib/data/queries/isosteres/CdoubleS2CdoubleO.correct b/data/queries/isosteres/CdoubleS2CdoubleO.correct similarity index 100% rename from contrib/data/queries/isosteres/CdoubleS2CdoubleO.correct rename to data/queries/isosteres/CdoubleS2CdoubleO.correct diff --git a/contrib/data/queries/isosteres/CdoubleS2CdoubleO.rxn b/data/queries/isosteres/CdoubleS2CdoubleO.rxn similarity index 100% rename from contrib/data/queries/isosteres/CdoubleS2CdoubleO.rxn rename to data/queries/isosteres/CdoubleS2CdoubleO.rxn diff --git a/contrib/data/queries/isosteres/CdoubleS2CdoubleO.smi b/data/queries/isosteres/CdoubleS2CdoubleO.smi similarity index 100% rename from contrib/data/queries/isosteres/CdoubleS2CdoubleO.smi rename to data/queries/isosteres/CdoubleS2CdoubleO.smi diff --git a/contrib/data/queries/isosteres/F2H.correct b/data/queries/isosteres/F2H.correct similarity index 100% rename from contrib/data/queries/isosteres/F2H.correct rename to data/queries/isosteres/F2H.correct diff --git a/contrib/data/queries/isosteres/F2H.rxn b/data/queries/isosteres/F2H.rxn similarity index 100% rename from contrib/data/queries/isosteres/F2H.rxn rename to data/queries/isosteres/F2H.rxn diff --git a/contrib/data/queries/isosteres/F2H.smi b/data/queries/isosteres/F2H.smi similarity index 100% rename from contrib/data/queries/isosteres/F2H.smi rename to data/queries/isosteres/F2H.smi diff --git a/contrib/data/queries/isosteres/cyclopropyl2ethyl.correct b/data/queries/isosteres/cyclopropyl2ethyl.correct similarity index 100% rename from contrib/data/queries/isosteres/cyclopropyl2ethyl.correct rename to data/queries/isosteres/cyclopropyl2ethyl.correct diff --git a/contrib/data/queries/isosteres/cyclopropyl2ethyl.rxn b/data/queries/isosteres/cyclopropyl2ethyl.rxn similarity index 100% rename from contrib/data/queries/isosteres/cyclopropyl2ethyl.rxn rename to data/queries/isosteres/cyclopropyl2ethyl.rxn diff --git a/contrib/data/queries/isosteres/cyclopropyl2ethyl.smi b/data/queries/isosteres/cyclopropyl2ethyl.smi similarity index 100% rename from contrib/data/queries/isosteres/cyclopropyl2ethyl.smi rename to data/queries/isosteres/cyclopropyl2ethyl.smi diff --git a/contrib/data/queries/isosteres/dotest b/data/queries/isosteres/dotest similarity index 100% rename from contrib/data/queries/isosteres/dotest rename to data/queries/isosteres/dotest diff --git a/contrib/data/queries/isosteres/furyl2phenyl.rxn b/data/queries/isosteres/furyl2phenyl.rxn similarity index 100% rename from contrib/data/queries/isosteres/furyl2phenyl.rxn rename to data/queries/isosteres/furyl2phenyl.rxn diff --git a/contrib/data/queries/isosteres/halogen2methyl.correct b/data/queries/isosteres/halogen2methyl.correct similarity index 100% rename from contrib/data/queries/isosteres/halogen2methyl.correct rename to data/queries/isosteres/halogen2methyl.correct diff --git a/contrib/data/queries/isosteres/halogen2methyl.rxn b/data/queries/isosteres/halogen2methyl.rxn similarity index 100% rename from contrib/data/queries/isosteres/halogen2methyl.rxn rename to data/queries/isosteres/halogen2methyl.rxn diff --git a/contrib/data/queries/isosteres/halogen2methyl.smi b/data/queries/isosteres/halogen2methyl.smi similarity index 100% rename from contrib/data/queries/isosteres/halogen2methyl.smi rename to data/queries/isosteres/halogen2methyl.smi diff --git a/contrib/data/queries/isosteres/queries b/data/queries/isosteres/queries similarity index 100% rename from contrib/data/queries/isosteres/queries rename to data/queries/isosteres/queries diff --git a/contrib/data/queries/isosteres/so22co.correct b/data/queries/isosteres/so22co.correct similarity index 100% rename from contrib/data/queries/isosteres/so22co.correct rename to data/queries/isosteres/so22co.correct diff --git a/contrib/data/queries/isosteres/so22co.rxn b/data/queries/isosteres/so22co.rxn similarity index 100% rename from contrib/data/queries/isosteres/so22co.rxn rename to data/queries/isosteres/so22co.rxn diff --git a/contrib/data/queries/isosteres/so22co.smi b/data/queries/isosteres/so22co.smi similarity index 100% rename from contrib/data/queries/isosteres/so22co.smi rename to data/queries/isosteres/so22co.smi diff --git a/contrib/data/queries/isosteres/so2co.correct b/data/queries/isosteres/so2co.correct similarity index 100% rename from contrib/data/queries/isosteres/so2co.correct rename to data/queries/isosteres/so2co.correct diff --git a/contrib/data/queries/isosteres/so2co.rxn b/data/queries/isosteres/so2co.rxn similarity index 100% rename from contrib/data/queries/isosteres/so2co.rxn rename to data/queries/isosteres/so2co.rxn diff --git a/contrib/data/queries/isosteres/so2co.smi b/data/queries/isosteres/so2co.smi similarity index 100% rename from contrib/data/queries/isosteres/so2co.smi rename to data/queries/isosteres/so2co.smi diff --git a/contrib/data/queries/isosteres/test_so2.smi b/data/queries/isosteres/test_so2.smi similarity index 100% rename from contrib/data/queries/isosteres/test_so2.smi rename to data/queries/isosteres/test_so2.smi diff --git a/contrib/data/queries/isosteres/thioether2methylene.correct b/data/queries/isosteres/thioether2methylene.correct similarity index 100% rename from contrib/data/queries/isosteres/thioether2methylene.correct rename to data/queries/isosteres/thioether2methylene.correct diff --git a/contrib/data/queries/isosteres/thioether2methylene.rxn b/data/queries/isosteres/thioether2methylene.rxn similarity index 100% rename from contrib/data/queries/isosteres/thioether2methylene.rxn rename to data/queries/isosteres/thioether2methylene.rxn diff --git a/contrib/data/queries/isosteres/thioether2methylene.smi b/data/queries/isosteres/thioether2methylene.smi similarity index 100% rename from contrib/data/queries/isosteres/thioether2methylene.smi rename to data/queries/isosteres/thioether2methylene.smi diff --git a/contrib/data/queries/medchemrules/3_valent_halogen.qry b/data/queries/medchemrules/3_valent_halogen.qry similarity index 100% rename from contrib/data/queries/medchemrules/3_valent_halogen.qry rename to data/queries/medchemrules/3_valent_halogen.qry diff --git a/contrib/data/queries/medchemrules/3_valent_iodine.qry b/data/queries/medchemrules/3_valent_iodine.qry similarity index 100% rename from contrib/data/queries/medchemrules/3_valent_iodine.qry rename to data/queries/medchemrules/3_valent_iodine.qry diff --git a/contrib/data/queries/medchemrules/4_valent_sulphur_2_connections.qry b/data/queries/medchemrules/4_valent_sulphur_2_connections.qry similarity index 100% rename from contrib/data/queries/medchemrules/4_valent_sulphur_2_connections.qry rename to data/queries/medchemrules/4_valent_sulphur_2_connections.qry diff --git a/contrib/data/queries/medchemrules/6_membered_aromatic_sulfur.qry b/data/queries/medchemrules/6_membered_aromatic_sulfur.qry similarity index 100% rename from contrib/data/queries/medchemrules/6_membered_aromatic_sulfur.qry rename to data/queries/medchemrules/6_membered_aromatic_sulfur.qry diff --git a/contrib/data/queries/medchemrules/8_aminoquinoline.qry b/data/queries/medchemrules/8_aminoquinoline.qry similarity index 100% rename from contrib/data/queries/medchemrules/8_aminoquinoline.qry rename to data/queries/medchemrules/8_aminoquinoline.qry diff --git a/contrib/data/queries/medchemrules/8_hydroxyquinoline.qry b/data/queries/medchemrules/8_hydroxyquinoline.qry similarity index 100% rename from contrib/data/queries/medchemrules/8_hydroxyquinoline.qry rename to data/queries/medchemrules/8_hydroxyquinoline.qry diff --git a/contrib/data/queries/medchemrules/9_aminoacridine.qry b/data/queries/medchemrules/9_aminoacridine.qry similarity index 100% rename from contrib/data/queries/medchemrules/9_aminoacridine.qry rename to data/queries/medchemrules/9_aminoacridine.qry diff --git a/contrib/data/queries/medchemrules/O_alkyl_hydroxylamine.qry b/data/queries/medchemrules/O_alkyl_hydroxylamine.qry similarity index 100% rename from contrib/data/queries/medchemrules/O_alkyl_hydroxylamine.qry rename to data/queries/medchemrules/O_alkyl_hydroxylamine.qry diff --git a/contrib/data/queries/medchemrules/acetal_1_in_ring.qry b/data/queries/medchemrules/acetal_1_in_ring.qry similarity index 100% rename from contrib/data/queries/medchemrules/acetal_1_in_ring.qry rename to data/queries/medchemrules/acetal_1_in_ring.qry diff --git a/contrib/data/queries/medchemrules/acetal_acyclic.qry b/data/queries/medchemrules/acetal_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/acetal_acyclic.qry rename to data/queries/medchemrules/acetal_acyclic.qry diff --git a/contrib/data/queries/medchemrules/acetal_both_in_ring.qry b/data/queries/medchemrules/acetal_both_in_ring.qry similarity index 100% rename from contrib/data/queries/medchemrules/acetal_both_in_ring.qry rename to data/queries/medchemrules/acetal_both_in_ring.qry diff --git a/contrib/data/queries/medchemrules/acetate_ester.qry b/data/queries/medchemrules/acetate_ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/acetate_ester.qry rename to data/queries/medchemrules/acetate_ester.qry diff --git a/contrib/data/queries/medchemrules/acetylene.qry b/data/queries/medchemrules/acetylene.qry similarity index 100% rename from contrib/data/queries/medchemrules/acetylene.qry rename to data/queries/medchemrules/acetylene.qry diff --git a/contrib/data/queries/medchemrules/acetylene_heteroatom.qry b/data/queries/medchemrules/acetylene_heteroatom.qry similarity index 100% rename from contrib/data/queries/medchemrules/acetylene_heteroatom.qry rename to data/queries/medchemrules/acetylene_heteroatom.qry diff --git a/contrib/data/queries/medchemrules/acid_halide.qry b/data/queries/medchemrules/acid_halide.qry similarity index 100% rename from contrib/data/queries/medchemrules/acid_halide.qry rename to data/queries/medchemrules/acid_halide.qry diff --git a/contrib/data/queries/medchemrules/activated_ester.qry b/data/queries/medchemrules/activated_ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/activated_ester.qry rename to data/queries/medchemrules/activated_ester.qry diff --git a/contrib/data/queries/medchemrules/activated_phthalimide.qry b/data/queries/medchemrules/activated_phthalimide.qry similarity index 100% rename from contrib/data/queries/medchemrules/activated_phthalimide.qry rename to data/queries/medchemrules/activated_phthalimide.qry diff --git a/contrib/data/queries/medchemrules/acyl_amide_acyclic.qry b/data/queries/medchemrules/acyl_amide_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_amide_acyclic.qry rename to data/queries/medchemrules/acyl_amide_acyclic.qry diff --git a/contrib/data/queries/medchemrules/acyl_amide_cyclic.qry b/data/queries/medchemrules/acyl_amide_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_amide_cyclic.qry rename to data/queries/medchemrules/acyl_amide_cyclic.qry diff --git a/contrib/data/queries/medchemrules/acyl_arom_n.qry b/data/queries/medchemrules/acyl_arom_n.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_arom_n.qry rename to data/queries/medchemrules/acyl_arom_n.qry diff --git a/contrib/data/queries/medchemrules/acyl_aromatic_nn.qry b/data/queries/medchemrules/acyl_aromatic_nn.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_aromatic_nn.qry rename to data/queries/medchemrules/acyl_aromatic_nn.qry diff --git a/contrib/data/queries/medchemrules/acyl_enol.qry b/data/queries/medchemrules/acyl_enol.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_enol.qry rename to data/queries/medchemrules/acyl_enol.qry diff --git a/contrib/data/queries/medchemrules/acyl_hydrazone_cyclic.qry b/data/queries/medchemrules/acyl_hydrazone_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_hydrazone_cyclic.qry rename to data/queries/medchemrules/acyl_hydrazone_cyclic.qry diff --git a/contrib/data/queries/medchemrules/acyl_hydroxamate.qry b/data/queries/medchemrules/acyl_hydroxamate.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_hydroxamate.qry rename to data/queries/medchemrules/acyl_hydroxamate.qry diff --git a/contrib/data/queries/medchemrules/acyl_hydroxamate_2.qry b/data/queries/medchemrules/acyl_hydroxamate_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_hydroxamate_2.qry rename to data/queries/medchemrules/acyl_hydroxamate_2.qry diff --git a/contrib/data/queries/medchemrules/acyl_hydroxamate_3.qry b/data/queries/medchemrules/acyl_hydroxamate_3.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_hydroxamate_3.qry rename to data/queries/medchemrules/acyl_hydroxamate_3.qry diff --git a/contrib/data/queries/medchemrules/acyl_isoamide_aromatic.qry b/data/queries/medchemrules/acyl_isoamide_aromatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_isoamide_aromatic.qry rename to data/queries/medchemrules/acyl_isoamide_aromatic.qry diff --git a/contrib/data/queries/medchemrules/acyl_oxime.qry b/data/queries/medchemrules/acyl_oxime.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_oxime.qry rename to data/queries/medchemrules/acyl_oxime.qry diff --git a/contrib/data/queries/medchemrules/acyl_sulfonamide.qry b/data/queries/medchemrules/acyl_sulfonamide.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_sulfonamide.qry rename to data/queries/medchemrules/acyl_sulfonamide.qry diff --git a/contrib/data/queries/medchemrules/acyl_thiohydroxamate.qry b/data/queries/medchemrules/acyl_thiohydroxamate.qry similarity index 100% rename from contrib/data/queries/medchemrules/acyl_thiohydroxamate.qry rename to data/queries/medchemrules/acyl_thiohydroxamate.qry diff --git a/contrib/data/queries/medchemrules/acylated_enol.qry b/data/queries/medchemrules/acylated_enol.qry similarity index 100% rename from contrib/data/queries/medchemrules/acylated_enol.qry rename to data/queries/medchemrules/acylated_enol.qry diff --git a/contrib/data/queries/medchemrules/acylated_halo_phenol.qry b/data/queries/medchemrules/acylated_halo_phenol.qry similarity index 100% rename from contrib/data/queries/medchemrules/acylated_halo_phenol.qry rename to data/queries/medchemrules/acylated_halo_phenol.qry diff --git a/contrib/data/queries/medchemrules/acylurea.qry b/data/queries/medchemrules/acylurea.qry similarity index 100% rename from contrib/data/queries/medchemrules/acylurea.qry rename to data/queries/medchemrules/acylurea.qry diff --git a/contrib/data/queries/medchemrules/adamantane.qry b/data/queries/medchemrules/adamantane.qry similarity index 100% rename from contrib/data/queries/medchemrules/adamantane.qry rename to data/queries/medchemrules/adamantane.qry diff --git a/contrib/data/queries/medchemrules/adamantane_sub.qry b/data/queries/medchemrules/adamantane_sub.qry similarity index 100% rename from contrib/data/queries/medchemrules/adamantane_sub.qry rename to data/queries/medchemrules/adamantane_sub.qry diff --git a/contrib/data/queries/medchemrules/aldehyde.qry b/data/queries/medchemrules/aldehyde.qry similarity index 100% rename from contrib/data/queries/medchemrules/aldehyde.qry rename to data/queries/medchemrules/aldehyde.qry diff --git a/contrib/data/queries/medchemrules/alkyl_fluoride_activated.qry b/data/queries/medchemrules/alkyl_fluoride_activated.qry similarity index 100% rename from contrib/data/queries/medchemrules/alkyl_fluoride_activated.qry rename to data/queries/medchemrules/alkyl_fluoride_activated.qry diff --git a/contrib/data/queries/medchemrules/alkyl_iodide.qry b/data/queries/medchemrules/alkyl_iodide.qry similarity index 100% rename from contrib/data/queries/medchemrules/alkyl_iodide.qry rename to data/queries/medchemrules/alkyl_iodide.qry diff --git a/contrib/data/queries/medchemrules/alkyl_sulfite.qry b/data/queries/medchemrules/alkyl_sulfite.qry similarity index 100% rename from contrib/data/queries/medchemrules/alkyl_sulfite.qry rename to data/queries/medchemrules/alkyl_sulfite.qry diff --git a/contrib/data/queries/medchemrules/alkylthio_N_aromatic.qry b/data/queries/medchemrules/alkylthio_N_aromatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/alkylthio_N_aromatic.qry rename to data/queries/medchemrules/alkylthio_N_aromatic.qry diff --git a/contrib/data/queries/medchemrules/alkyne_michael.qry b/data/queries/medchemrules/alkyne_michael.qry similarity index 100% rename from contrib/data/queries/medchemrules/alkyne_michael.qry rename to data/queries/medchemrules/alkyne_michael.qry diff --git a/contrib/data/queries/medchemrules/alkynylsulfone.qry b/data/queries/medchemrules/alkynylsulfone.qry similarity index 100% rename from contrib/data/queries/medchemrules/alkynylsulfone.qry rename to data/queries/medchemrules/alkynylsulfone.qry diff --git a/contrib/data/queries/medchemrules/allene.qry b/data/queries/medchemrules/allene.qry similarity index 100% rename from contrib/data/queries/medchemrules/allene.qry rename to data/queries/medchemrules/allene.qry diff --git a/contrib/data/queries/medchemrules/aminal_acyclic.qry b/data/queries/medchemrules/aminal_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/aminal_acyclic.qry rename to data/queries/medchemrules/aminal_acyclic.qry diff --git a/contrib/data/queries/medchemrules/amino_ester.qry b/data/queries/medchemrules/amino_ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/amino_ester.qry rename to data/queries/medchemrules/amino_ester.qry diff --git a/contrib/data/queries/medchemrules/amino_naphthalene.qry b/data/queries/medchemrules/amino_naphthalene.qry similarity index 100% rename from contrib/data/queries/medchemrules/amino_naphthalene.qry rename to data/queries/medchemrules/amino_naphthalene.qry diff --git a/contrib/data/queries/medchemrules/aminomethyl_ketone_peptide.qry b/data/queries/medchemrules/aminomethyl_ketone_peptide.qry similarity index 100% rename from contrib/data/queries/medchemrules/aminomethyl_ketone_peptide.qry rename to data/queries/medchemrules/aminomethyl_ketone_peptide.qry diff --git a/contrib/data/queries/medchemrules/aminophenol.qry b/data/queries/medchemrules/aminophenol.qry similarity index 100% rename from contrib/data/queries/medchemrules/aminophenol.qry rename to data/queries/medchemrules/aminophenol.qry diff --git a/contrib/data/queries/medchemrules/anhydride.qry b/data/queries/medchemrules/anhydride.qry similarity index 100% rename from contrib/data/queries/medchemrules/anhydride.qry rename to data/queries/medchemrules/anhydride.qry diff --git a/contrib/data/queries/medchemrules/aniline_acyl_ewd.qry b/data/queries/medchemrules/aniline_acyl_ewd.qry similarity index 100% rename from contrib/data/queries/medchemrules/aniline_acyl_ewd.qry rename to data/queries/medchemrules/aniline_acyl_ewd.qry diff --git a/contrib/data/queries/medchemrules/aniline_acyl_newd.qry b/data/queries/medchemrules/aniline_acyl_newd.qry similarity index 100% rename from contrib/data/queries/medchemrules/aniline_acyl_newd.qry rename to data/queries/medchemrules/aniline_acyl_newd.qry diff --git a/contrib/data/queries/medchemrules/aniline_h_ewd.qry b/data/queries/medchemrules/aniline_h_ewd.qry similarity index 100% rename from contrib/data/queries/medchemrules/aniline_h_ewd.qry rename to data/queries/medchemrules/aniline_h_ewd.qry diff --git a/contrib/data/queries/medchemrules/aniline_h_newd.qry b/data/queries/medchemrules/aniline_h_newd.qry similarity index 100% rename from contrib/data/queries/medchemrules/aniline_h_newd.qry rename to data/queries/medchemrules/aniline_h_newd.qry diff --git a/contrib/data/queries/medchemrules/aniline_no_h_ewd.qry b/data/queries/medchemrules/aniline_no_h_ewd.qry similarity index 100% rename from contrib/data/queries/medchemrules/aniline_no_h_ewd.qry rename to data/queries/medchemrules/aniline_no_h_ewd.qry diff --git a/contrib/data/queries/medchemrules/aniline_no_h_newd.qry b/data/queries/medchemrules/aniline_no_h_newd.qry similarity index 100% rename from contrib/data/queries/medchemrules/aniline_no_h_newd.qry rename to data/queries/medchemrules/aniline_no_h_newd.qry diff --git a/contrib/data/queries/medchemrules/anthra_ketone.qry b/data/queries/medchemrules/anthra_ketone.qry similarity index 100% rename from contrib/data/queries/medchemrules/anthra_ketone.qry rename to data/queries/medchemrules/anthra_ketone.qry diff --git a/contrib/data/queries/medchemrules/anthracene_het.qry b/data/queries/medchemrules/anthracene_het.qry similarity index 100% rename from contrib/data/queries/medchemrules/anthracene_het.qry rename to data/queries/medchemrules/anthracene_het.qry diff --git a/contrib/data/queries/medchemrules/anthracene_phenanthrene.qry b/data/queries/medchemrules/anthracene_phenanthrene.qry similarity index 100% rename from contrib/data/queries/medchemrules/anthracene_phenanthrene.qry rename to data/queries/medchemrules/anthracene_phenanthrene.qry diff --git a/contrib/data/queries/medchemrules/aromatic_iodide.qry b/data/queries/medchemrules/aromatic_iodide.qry similarity index 100% rename from contrib/data/queries/medchemrules/aromatic_iodide.qry rename to data/queries/medchemrules/aromatic_iodide.qry diff --git a/contrib/data/queries/medchemrules/azapteridine.qry b/data/queries/medchemrules/azapteridine.qry similarity index 100% rename from contrib/data/queries/medchemrules/azapteridine.qry rename to data/queries/medchemrules/azapteridine.qry diff --git a/contrib/data/queries/medchemrules/aziridine.qry b/data/queries/medchemrules/aziridine.qry similarity index 100% rename from contrib/data/queries/medchemrules/aziridine.qry rename to data/queries/medchemrules/aziridine.qry diff --git a/contrib/data/queries/medchemrules/benzocyclopentenone.qry b/data/queries/medchemrules/benzocyclopentenone.qry similarity index 100% rename from contrib/data/queries/medchemrules/benzocyclopentenone.qry rename to data/queries/medchemrules/benzocyclopentenone.qry diff --git a/contrib/data/queries/medchemrules/beta_lactone.qry b/data/queries/medchemrules/beta_lactone.qry similarity index 100% rename from contrib/data/queries/medchemrules/beta_lactone.qry rename to data/queries/medchemrules/beta_lactone.qry diff --git a/contrib/data/queries/medchemrules/biguanide.qry b/data/queries/medchemrules/biguanide.qry similarity index 100% rename from contrib/data/queries/medchemrules/biguanide.qry rename to data/queries/medchemrules/biguanide.qry diff --git a/contrib/data/queries/medchemrules/biotin.qry b/data/queries/medchemrules/biotin.qry similarity index 100% rename from contrib/data/queries/medchemrules/biotin.qry rename to data/queries/medchemrules/biotin.qry diff --git a/contrib/data/queries/medchemrules/bis_aryl_maleimide.qry b/data/queries/medchemrules/bis_aryl_maleimide.qry similarity index 100% rename from contrib/data/queries/medchemrules/bis_aryl_maleimide.qry rename to data/queries/medchemrules/bis_aryl_maleimide.qry diff --git a/contrib/data/queries/medchemrules/boc.qry b/data/queries/medchemrules/boc.qry similarity index 100% rename from contrib/data/queries/medchemrules/boc.qry rename to data/queries/medchemrules/boc.qry diff --git a/contrib/data/queries/medchemrules/bromine.qry b/data/queries/medchemrules/bromine.qry similarity index 100% rename from contrib/data/queries/medchemrules/bromine.qry rename to data/queries/medchemrules/bromine.qry diff --git a/contrib/data/queries/medchemrules/ccl3.qry b/data/queries/medchemrules/ccl3.qry similarity index 100% rename from contrib/data/queries/medchemrules/ccl3.qry rename to data/queries/medchemrules/ccl3.qry diff --git a/contrib/data/queries/medchemrules/cf3.qry b/data/queries/medchemrules/cf3.qry similarity index 100% rename from contrib/data/queries/medchemrules/cf3.qry rename to data/queries/medchemrules/cf3.qry diff --git a/contrib/data/queries/medchemrules/charged_halide.qry b/data/queries/medchemrules/charged_halide.qry similarity index 100% rename from contrib/data/queries/medchemrules/charged_halide.qry rename to data/queries/medchemrules/charged_halide.qry diff --git a/contrib/data/queries/medchemrules/chlorine.qry b/data/queries/medchemrules/chlorine.qry similarity index 100% rename from contrib/data/queries/medchemrules/chlorine.qry rename to data/queries/medchemrules/chlorine.qry diff --git a/contrib/data/queries/medchemrules/conjugated_triene_acyclic_2.qry b/data/queries/medchemrules/conjugated_triene_acyclic_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/conjugated_triene_acyclic_2.qry rename to data/queries/medchemrules/conjugated_triene_acyclic_2.qry diff --git a/contrib/data/queries/medchemrules/coumarin.qry b/data/queries/medchemrules/coumarin.qry similarity index 100% rename from contrib/data/queries/medchemrules/coumarin.qry rename to data/queries/medchemrules/coumarin.qry diff --git a/contrib/data/queries/medchemrules/cplus.qry b/data/queries/medchemrules/cplus.qry similarity index 100% rename from contrib/data/queries/medchemrules/cplus.qry rename to data/queries/medchemrules/cplus.qry diff --git a/contrib/data/queries/medchemrules/crown_2_2.qry b/data/queries/medchemrules/crown_2_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_2_2.qry rename to data/queries/medchemrules/crown_2_2.qry diff --git a/contrib/data/queries/medchemrules/crown_2_2_acyclic.qry b/data/queries/medchemrules/crown_2_2_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_2_2_acyclic.qry rename to data/queries/medchemrules/crown_2_2_acyclic.qry diff --git a/contrib/data/queries/medchemrules/crown_2_2_cyclic.qry b/data/queries/medchemrules/crown_2_2_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_2_2_cyclic.qry rename to data/queries/medchemrules/crown_2_2_cyclic.qry diff --git a/contrib/data/queries/medchemrules/crown_2_3.qry b/data/queries/medchemrules/crown_2_3.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_2_3.qry rename to data/queries/medchemrules/crown_2_3.qry diff --git a/contrib/data/queries/medchemrules/crown_2_3_acyclic.qry b/data/queries/medchemrules/crown_2_3_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_2_3_acyclic.qry rename to data/queries/medchemrules/crown_2_3_acyclic.qry diff --git a/contrib/data/queries/medchemrules/crown_2_3_cyclic.qry b/data/queries/medchemrules/crown_2_3_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_2_3_cyclic.qry rename to data/queries/medchemrules/crown_2_3_cyclic.qry diff --git a/contrib/data/queries/medchemrules/crown_3_3.qry b/data/queries/medchemrules/crown_3_3.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_3_3.qry rename to data/queries/medchemrules/crown_3_3.qry diff --git a/contrib/data/queries/medchemrules/crown_3_3_acyclic.qry b/data/queries/medchemrules/crown_3_3_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_3_3_acyclic.qry rename to data/queries/medchemrules/crown_3_3_acyclic.qry diff --git a/contrib/data/queries/medchemrules/crown_3_3_cyclic.qry b/data/queries/medchemrules/crown_3_3_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/crown_3_3_cyclic.qry rename to data/queries/medchemrules/crown_3_3_cyclic.qry diff --git a/contrib/data/queries/medchemrules/cyanine_dye.qry b/data/queries/medchemrules/cyanine_dye.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyanine_dye.qry rename to data/queries/medchemrules/cyanine_dye.qry diff --git a/contrib/data/queries/medchemrules/cyano.qry b/data/queries/medchemrules/cyano.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyano.qry rename to data/queries/medchemrules/cyano.qry diff --git a/contrib/data/queries/medchemrules/cyano_amine.qry b/data/queries/medchemrules/cyano_amine.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyano_amine.qry rename to data/queries/medchemrules/cyano_amine.qry diff --git a/contrib/data/queries/medchemrules/cyano_methyl_amine.qry b/data/queries/medchemrules/cyano_methyl_amine.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyano_methyl_amine.qry rename to data/queries/medchemrules/cyano_methyl_amine.qry diff --git a/contrib/data/queries/medchemrules/cyano_methyl_sulfide.qry b/data/queries/medchemrules/cyano_methyl_sulfide.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyano_methyl_sulfide.qry rename to data/queries/medchemrules/cyano_methyl_sulfide.qry diff --git a/contrib/data/queries/medchemrules/cyanohydrin.qry b/data/queries/medchemrules/cyanohydrin.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyanohydrin.qry rename to data/queries/medchemrules/cyanohydrin.qry diff --git a/contrib/data/queries/medchemrules/cyclobutadiene.qry b/data/queries/medchemrules/cyclobutadiene.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyclobutadiene.qry rename to data/queries/medchemrules/cyclobutadiene.qry diff --git a/contrib/data/queries/medchemrules/cyclohexane.qry b/data/queries/medchemrules/cyclohexane.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyclohexane.qry rename to data/queries/medchemrules/cyclohexane.qry diff --git a/contrib/data/queries/medchemrules/cyclohexane_diene.qry b/data/queries/medchemrules/cyclohexane_diene.qry similarity index 100% rename from contrib/data/queries/medchemrules/cyclohexane_diene.qry rename to data/queries/medchemrules/cyclohexane_diene.qry diff --git a/contrib/data/queries/medchemrules/demerits b/data/queries/medchemrules/demerits similarity index 100% rename from contrib/data/queries/medchemrules/demerits rename to data/queries/medchemrules/demerits diff --git a/contrib/data/queries/medchemrules/di_thio_acetal_acyclic.qry b/data/queries/medchemrules/di_thio_acetal_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/di_thio_acetal_acyclic.qry rename to data/queries/medchemrules/di_thio_acetal_acyclic.qry diff --git a/contrib/data/queries/medchemrules/diacylhydrazide.qry b/data/queries/medchemrules/diacylhydrazide.qry similarity index 100% rename from contrib/data/queries/medchemrules/diacylhydrazide.qry rename to data/queries/medchemrules/diacylhydrazide.qry diff --git a/contrib/data/queries/medchemrules/dialkylsulfate_cyclic.qry b/data/queries/medchemrules/dialkylsulfate_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/dialkylsulfate_cyclic.qry rename to data/queries/medchemrules/dialkylsulfate_cyclic.qry diff --git a/contrib/data/queries/medchemrules/diamidine.qry b/data/queries/medchemrules/diamidine.qry similarity index 100% rename from contrib/data/queries/medchemrules/diamidine.qry rename to data/queries/medchemrules/diamidine.qry diff --git a/contrib/data/queries/medchemrules/diaminal_acyclic.qry b/data/queries/medchemrules/diaminal_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/diaminal_acyclic.qry rename to data/queries/medchemrules/diaminal_acyclic.qry diff --git a/contrib/data/queries/medchemrules/diazo_cyclic.qry b/data/queries/medchemrules/diazo_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/diazo_cyclic.qry rename to data/queries/medchemrules/diazo_cyclic.qry diff --git a/contrib/data/queries/medchemrules/dicyanomethylene.qry b/data/queries/medchemrules/dicyanomethylene.qry similarity index 100% rename from contrib/data/queries/medchemrules/dicyanomethylene.qry rename to data/queries/medchemrules/dicyanomethylene.qry diff --git a/contrib/data/queries/medchemrules/dienone.qry b/data/queries/medchemrules/dienone.qry similarity index 100% rename from contrib/data/queries/medchemrules/dienone.qry rename to data/queries/medchemrules/dienone.qry diff --git a/contrib/data/queries/medchemrules/dihalo_vinyl_1_2_dicarbonyl.qry b/data/queries/medchemrules/dihalo_vinyl_1_2_dicarbonyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/dihalo_vinyl_1_2_dicarbonyl.qry rename to data/queries/medchemrules/dihalo_vinyl_1_2_dicarbonyl.qry diff --git a/contrib/data/queries/medchemrules/dihydro_124_triazine.qry b/data/queries/medchemrules/dihydro_124_triazine.qry similarity index 100% rename from contrib/data/queries/medchemrules/dihydro_124_triazine.qry rename to data/queries/medchemrules/dihydro_124_triazine.qry diff --git a/contrib/data/queries/medchemrules/dihydro_pyrrolidone.qry b/data/queries/medchemrules/dihydro_pyrrolidone.qry similarity index 100% rename from contrib/data/queries/medchemrules/dihydro_pyrrolidone.qry rename to data/queries/medchemrules/dihydro_pyrrolidone.qry diff --git a/contrib/data/queries/medchemrules/diphosphate.qry b/data/queries/medchemrules/diphosphate.qry similarity index 100% rename from contrib/data/queries/medchemrules/diphosphate.qry rename to data/queries/medchemrules/diphosphate.qry diff --git a/contrib/data/queries/medchemrules/dithio_olefin.qry b/data/queries/medchemrules/dithio_olefin.qry similarity index 100% rename from contrib/data/queries/medchemrules/dithio_olefin.qry rename to data/queries/medchemrules/dithio_olefin.qry diff --git a/contrib/data/queries/medchemrules/divinyl_carbonyl.qry b/data/queries/medchemrules/divinyl_carbonyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/divinyl_carbonyl.qry rename to data/queries/medchemrules/divinyl_carbonyl.qry diff --git a/contrib/data/queries/medchemrules/dna_intercalator_1.qry b/data/queries/medchemrules/dna_intercalator_1.qry similarity index 100% rename from contrib/data/queries/medchemrules/dna_intercalator_1.qry rename to data/queries/medchemrules/dna_intercalator_1.qry diff --git a/contrib/data/queries/medchemrules/enamine.qry b/data/queries/medchemrules/enamine.qry similarity index 100% rename from contrib/data/queries/medchemrules/enamine.qry rename to data/queries/medchemrules/enamine.qry diff --git a/contrib/data/queries/medchemrules/enamine_2.qry b/data/queries/medchemrules/enamine_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/enamine_2.qry rename to data/queries/medchemrules/enamine_2.qry diff --git a/contrib/data/queries/medchemrules/enol_or_vinyl_ether.qry b/data/queries/medchemrules/enol_or_vinyl_ether.qry similarity index 100% rename from contrib/data/queries/medchemrules/enol_or_vinyl_ether.qry rename to data/queries/medchemrules/enol_or_vinyl_ether.qry diff --git a/contrib/data/queries/medchemrules/ester.qry b/data/queries/medchemrules/ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/ester.qry rename to data/queries/medchemrules/ester.qry diff --git a/contrib/data/queries/medchemrules/ester_thione.qry b/data/queries/medchemrules/ester_thione.qry similarity index 100% rename from contrib/data/queries/medchemrules/ester_thione.qry rename to data/queries/medchemrules/ester_thione.qry diff --git a/contrib/data/queries/medchemrules/f2_c_o2.qry b/data/queries/medchemrules/f2_c_o2.qry similarity index 100% rename from contrib/data/queries/medchemrules/f2_c_o2.qry rename to data/queries/medchemrules/f2_c_o2.qry diff --git a/contrib/data/queries/medchemrules/five_connected_n_or_p.qry b/data/queries/medchemrules/five_connected_n_or_p.qry similarity index 100% rename from contrib/data/queries/medchemrules/five_connected_n_or_p.qry rename to data/queries/medchemrules/five_connected_n_or_p.qry diff --git a/contrib/data/queries/medchemrules/five_valent_nitrogen.qry b/data/queries/medchemrules/five_valent_nitrogen.qry similarity index 100% rename from contrib/data/queries/medchemrules/five_valent_nitrogen.qry rename to data/queries/medchemrules/five_valent_nitrogen.qry diff --git a/contrib/data/queries/medchemrules/fluorine.qry b/data/queries/medchemrules/fluorine.qry similarity index 100% rename from contrib/data/queries/medchemrules/fluorine.qry rename to data/queries/medchemrules/fluorine.qry diff --git a/contrib/data/queries/medchemrules/fluoro_methyl_ketone.qry b/data/queries/medchemrules/fluoro_methyl_ketone.qry similarity index 100% rename from contrib/data/queries/medchemrules/fluoro_methyl_ketone.qry rename to data/queries/medchemrules/fluoro_methyl_ketone.qry diff --git a/contrib/data/queries/medchemrules/fmoc.qry b/data/queries/medchemrules/fmoc.qry similarity index 100% rename from contrib/data/queries/medchemrules/fmoc.qry rename to data/queries/medchemrules/fmoc.qry diff --git a/contrib/data/queries/medchemrules/formylated.qry b/data/queries/medchemrules/formylated.qry similarity index 100% rename from contrib/data/queries/medchemrules/formylated.qry rename to data/queries/medchemrules/formylated.qry diff --git a/contrib/data/queries/medchemrules/four_valent_s_h.qry b/data/queries/medchemrules/four_valent_s_h.qry similarity index 100% rename from contrib/data/queries/medchemrules/four_valent_s_h.qry rename to data/queries/medchemrules/four_valent_s_h.qry diff --git a/contrib/data/queries/medchemrules/four_valent_sulphur.qry b/data/queries/medchemrules/four_valent_sulphur.qry similarity index 100% rename from contrib/data/queries/medchemrules/four_valent_sulphur.qry rename to data/queries/medchemrules/four_valent_sulphur.qry diff --git a/contrib/data/queries/medchemrules/furan.qry b/data/queries/medchemrules/furan.qry similarity index 100% rename from contrib/data/queries/medchemrules/furan.qry rename to data/queries/medchemrules/furan.qry diff --git a/contrib/data/queries/medchemrules/fused_tetrahydroquinoline.qry b/data/queries/medchemrules/fused_tetrahydroquinoline.qry similarity index 100% rename from contrib/data/queries/medchemrules/fused_tetrahydroquinoline.qry rename to data/queries/medchemrules/fused_tetrahydroquinoline.qry diff --git a/contrib/data/queries/medchemrules/half_sulfur_peroxide.qry b/data/queries/medchemrules/half_sulfur_peroxide.qry similarity index 100% rename from contrib/data/queries/medchemrules/half_sulfur_peroxide.qry rename to data/queries/medchemrules/half_sulfur_peroxide.qry diff --git a/contrib/data/queries/medchemrules/halo_imine.qry b/data/queries/medchemrules/halo_imine.qry similarity index 100% rename from contrib/data/queries/medchemrules/halo_imine.qry rename to data/queries/medchemrules/halo_imine.qry diff --git a/contrib/data/queries/medchemrules/halo_next_to_aryl_n_w_ewg.qry b/data/queries/medchemrules/halo_next_to_aryl_n_w_ewg.qry similarity index 100% rename from contrib/data/queries/medchemrules/halo_next_to_aryl_n_w_ewg.qry rename to data/queries/medchemrules/halo_next_to_aryl_n_w_ewg.qry diff --git a/contrib/data/queries/medchemrules/halo_phthalazine.qry b/data/queries/medchemrules/halo_phthalazine.qry similarity index 100% rename from contrib/data/queries/medchemrules/halo_phthalazine.qry rename to data/queries/medchemrules/halo_phthalazine.qry diff --git a/contrib/data/queries/medchemrules/halogen_nps.qry b/data/queries/medchemrules/halogen_nps.qry similarity index 100% rename from contrib/data/queries/medchemrules/halogen_nps.qry rename to data/queries/medchemrules/halogen_nps.qry diff --git a/contrib/data/queries/medchemrules/halogen_to_oxygen.qry b/data/queries/medchemrules/halogen_to_oxygen.qry similarity index 100% rename from contrib/data/queries/medchemrules/halogen_to_oxygen.qry rename to data/queries/medchemrules/halogen_to_oxygen.qry diff --git a/contrib/data/queries/medchemrules/halogenated_aromatic.qry b/data/queries/medchemrules/halogenated_aromatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/halogenated_aromatic.qry rename to data/queries/medchemrules/halogenated_aromatic.qry diff --git a/contrib/data/queries/medchemrules/halomethyl_ketone.qry b/data/queries/medchemrules/halomethyl_ketone.qry similarity index 100% rename from contrib/data/queries/medchemrules/halomethyl_ketone.qry rename to data/queries/medchemrules/halomethyl_ketone.qry diff --git a/contrib/data/queries/medchemrules/hemiacetal_acyclic.qry b/data/queries/medchemrules/hemiacetal_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/hemiacetal_acyclic.qry rename to data/queries/medchemrules/hemiacetal_acyclic.qry diff --git a/contrib/data/queries/medchemrules/het_3mem_ring.qry b/data/queries/medchemrules/het_3mem_ring.qry similarity index 100% rename from contrib/data/queries/medchemrules/het_3mem_ring.qry rename to data/queries/medchemrules/het_3mem_ring.qry diff --git a/contrib/data/queries/medchemrules/het_3mem_ring_fused.qry b/data/queries/medchemrules/het_3mem_ring_fused.qry similarity index 100% rename from contrib/data/queries/medchemrules/het_3mem_ring_fused.qry rename to data/queries/medchemrules/het_3mem_ring_fused.qry diff --git a/contrib/data/queries/medchemrules/hydrazide.qry b/data/queries/medchemrules/hydrazide.qry similarity index 100% rename from contrib/data/queries/medchemrules/hydrazide.qry rename to data/queries/medchemrules/hydrazide.qry diff --git a/contrib/data/queries/medchemrules/hydrazide_acyclic.qry b/data/queries/medchemrules/hydrazide_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/hydrazide_acyclic.qry rename to data/queries/medchemrules/hydrazide_acyclic.qry diff --git a/contrib/data/queries/medchemrules/hydrazide_cyclic.qry b/data/queries/medchemrules/hydrazide_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/hydrazide_cyclic.qry rename to data/queries/medchemrules/hydrazide_cyclic.qry diff --git a/contrib/data/queries/medchemrules/hydrazone.qry b/data/queries/medchemrules/hydrazone.qry similarity index 100% rename from contrib/data/queries/medchemrules/hydrazone.qry rename to data/queries/medchemrules/hydrazone.qry diff --git a/contrib/data/queries/medchemrules/iminal.qry b/data/queries/medchemrules/iminal.qry similarity index 100% rename from contrib/data/queries/medchemrules/iminal.qry rename to data/queries/medchemrules/iminal.qry diff --git a/contrib/data/queries/medchemrules/imine_aromatic.qry b/data/queries/medchemrules/imine_aromatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/imine_aromatic.qry rename to data/queries/medchemrules/imine_aromatic.qry diff --git a/contrib/data/queries/medchemrules/imino_oxime.qry b/data/queries/medchemrules/imino_oxime.qry similarity index 100% rename from contrib/data/queries/medchemrules/imino_oxime.qry rename to data/queries/medchemrules/imino_oxime.qry diff --git a/contrib/data/queries/medchemrules/isoamide_acyclic.qry b/data/queries/medchemrules/isoamide_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/isoamide_acyclic.qry rename to data/queries/medchemrules/isoamide_acyclic.qry diff --git a/contrib/data/queries/medchemrules/isocyano.qry b/data/queries/medchemrules/isocyano.qry similarity index 100% rename from contrib/data/queries/medchemrules/isocyano.qry rename to data/queries/medchemrules/isocyano.qry diff --git a/contrib/data/queries/medchemrules/isodithiocarbamate.qry b/data/queries/medchemrules/isodithiocarbamate.qry similarity index 100% rename from contrib/data/queries/medchemrules/isodithiocarbamate.qry rename to data/queries/medchemrules/isodithiocarbamate.qry diff --git a/contrib/data/queries/medchemrules/isolated_aromatic.qry b/data/queries/medchemrules/isolated_aromatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/isolated_aromatic.qry rename to data/queries/medchemrules/isolated_aromatic.qry diff --git a/contrib/data/queries/medchemrules/isothiazole_carbonyl.qry b/data/queries/medchemrules/isothiazole_carbonyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/isothiazole_carbonyl.qry rename to data/queries/medchemrules/isothiazole_carbonyl.qry diff --git a/contrib/data/queries/medchemrules/isothioamide_cyclic.qry b/data/queries/medchemrules/isothioamide_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/isothioamide_cyclic.qry rename to data/queries/medchemrules/isothioamide_cyclic.qry diff --git a/contrib/data/queries/medchemrules/isothioamide_cyclicS.qry b/data/queries/medchemrules/isothioamide_cyclicS.qry similarity index 100% rename from contrib/data/queries/medchemrules/isothioamide_cyclicS.qry rename to data/queries/medchemrules/isothioamide_cyclicS.qry diff --git a/contrib/data/queries/medchemrules/isothiourea.qry b/data/queries/medchemrules/isothiourea.qry similarity index 100% rename from contrib/data/queries/medchemrules/isothiourea.qry rename to data/queries/medchemrules/isothiourea.qry diff --git a/contrib/data/queries/medchemrules/isothiourea_sulfonamide.qry b/data/queries/medchemrules/isothiourea_sulfonamide.qry similarity index 100% rename from contrib/data/queries/medchemrules/isothiourea_sulfonamide.qry rename to data/queries/medchemrules/isothiourea_sulfonamide.qry diff --git a/contrib/data/queries/medchemrules/keto_carbonyl.qry b/data/queries/medchemrules/keto_carbonyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/keto_carbonyl.qry rename to data/queries/medchemrules/keto_carbonyl.qry diff --git a/contrib/data/queries/medchemrules/ketoamide_cyclic.qry b/data/queries/medchemrules/ketoamide_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/ketoamide_cyclic.qry rename to data/queries/medchemrules/ketoamide_cyclic.qry diff --git a/contrib/data/queries/medchemrules/lucifer_yellow.qry b/data/queries/medchemrules/lucifer_yellow.qry similarity index 100% rename from contrib/data/queries/medchemrules/lucifer_yellow.qry rename to data/queries/medchemrules/lucifer_yellow.qry diff --git a/contrib/data/queries/medchemrules/mcr_queries b/data/queries/medchemrules/mcr_queries similarity index 100% rename from contrib/data/queries/medchemrules/mcr_queries rename to data/queries/medchemrules/mcr_queries diff --git a/contrib/data/queries/medchemrules/melamine.qry b/data/queries/medchemrules/melamine.qry similarity index 100% rename from contrib/data/queries/medchemrules/melamine.qry rename to data/queries/medchemrules/melamine.qry diff --git a/contrib/data/queries/medchemrules/menthol.qry b/data/queries/medchemrules/menthol.qry similarity index 100% rename from contrib/data/queries/medchemrules/menthol.qry rename to data/queries/medchemrules/menthol.qry diff --git a/contrib/data/queries/medchemrules/metanitro.qry b/data/queries/medchemrules/metanitro.qry similarity index 100% rename from contrib/data/queries/medchemrules/metanitro.qry rename to data/queries/medchemrules/metanitro.qry diff --git a/contrib/data/queries/medchemrules/methylene_bis_sulfone.qry b/data/queries/medchemrules/methylene_bis_sulfone.qry similarity index 100% rename from contrib/data/queries/medchemrules/methylene_bis_sulfone.qry rename to data/queries/medchemrules/methylene_bis_sulfone.qry diff --git a/contrib/data/queries/medchemrules/methylene_bis_sulfone_diaryl.qry b/data/queries/medchemrules/methylene_bis_sulfone_diaryl.qry similarity index 100% rename from contrib/data/queries/medchemrules/methylene_bis_sulfone_diaryl.qry rename to data/queries/medchemrules/methylene_bis_sulfone_diaryl.qry diff --git a/contrib/data/queries/medchemrules/michael_demerited.qry b/data/queries/medchemrules/michael_demerited.qry similarity index 100% rename from contrib/data/queries/medchemrules/michael_demerited.qry rename to data/queries/medchemrules/michael_demerited.qry diff --git a/contrib/data/queries/medchemrules/michael_rejected.qry b/data/queries/medchemrules/michael_rejected.qry similarity index 100% rename from contrib/data/queries/medchemrules/michael_rejected.qry rename to data/queries/medchemrules/michael_rejected.qry diff --git a/contrib/data/queries/medchemrules/michael_thione.qry b/data/queries/medchemrules/michael_thione.qry similarity index 100% rename from contrib/data/queries/medchemrules/michael_thione.qry rename to data/queries/medchemrules/michael_thione.qry diff --git a/contrib/data/queries/medchemrules/multiple_nitro.qry b/data/queries/medchemrules/multiple_nitro.qry similarity index 100% rename from contrib/data/queries/medchemrules/multiple_nitro.qry rename to data/queries/medchemrules/multiple_nitro.qry diff --git a/contrib/data/queries/medchemrules/n_double_s_double_n_ring.qry b/data/queries/medchemrules/n_double_s_double_n_ring.qry similarity index 100% rename from contrib/data/queries/medchemrules/n_double_s_double_n_ring.qry rename to data/queries/medchemrules/n_double_s_double_n_ring.qry diff --git a/contrib/data/queries/medchemrules/n_hydroxy.qry b/data/queries/medchemrules/n_hydroxy.qry similarity index 100% rename from contrib/data/queries/medchemrules/n_hydroxy.qry rename to data/queries/medchemrules/n_hydroxy.qry diff --git a/contrib/data/queries/medchemrules/n_o_acyclic.qry b/data/queries/medchemrules/n_o_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/n_o_acyclic.qry rename to data/queries/medchemrules/n_o_acyclic.qry diff --git a/contrib/data/queries/medchemrules/n_oxide.qry b/data/queries/medchemrules/n_oxide.qry similarity index 100% rename from contrib/data/queries/medchemrules/n_oxide.qry rename to data/queries/medchemrules/n_oxide.qry diff --git a/contrib/data/queries/medchemrules/n_s_acyclic.qry b/data/queries/medchemrules/n_s_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/n_s_acyclic.qry rename to data/queries/medchemrules/n_s_acyclic.qry diff --git a/contrib/data/queries/medchemrules/naphthalene_sulfonate.qry b/data/queries/medchemrules/naphthalene_sulfonate.qry similarity index 100% rename from contrib/data/queries/medchemrules/naphthalene_sulfonate.qry rename to data/queries/medchemrules/naphthalene_sulfonate.qry diff --git a/contrib/data/queries/medchemrules/naphthyl.qry b/data/queries/medchemrules/naphthyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/naphthyl.qry rename to data/queries/medchemrules/naphthyl.qry diff --git a/contrib/data/queries/medchemrules/ncn.qry b/data/queries/medchemrules/ncn.qry similarity index 100% rename from contrib/data/queries/medchemrules/ncn.qry rename to data/queries/medchemrules/ncn.qry diff --git a/contrib/data/queries/medchemrules/nitro.qry b/data/queries/medchemrules/nitro.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitro.qry rename to data/queries/medchemrules/nitro.qry diff --git a/contrib/data/queries/medchemrules/nitro_alpha_hetero.qry b/data/queries/medchemrules/nitro_alpha_hetero.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitro_alpha_hetero.qry rename to data/queries/medchemrules/nitro_alpha_hetero.qry diff --git a/contrib/data/queries/medchemrules/nitro_alpha_to_halogen.qry b/data/queries/medchemrules/nitro_alpha_to_halogen.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitro_alpha_to_halogen.qry rename to data/queries/medchemrules/nitro_alpha_to_halogen.qry diff --git a/contrib/data/queries/medchemrules/nitro_phenol_or_aniline.qry b/data/queries/medchemrules/nitro_phenol_or_aniline.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitro_phenol_or_aniline.qry rename to data/queries/medchemrules/nitro_phenol_or_aniline.qry diff --git a/contrib/data/queries/medchemrules/nitromethyl_sulfone.qry b/data/queries/medchemrules/nitromethyl_sulfone.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitromethyl_sulfone.qry rename to data/queries/medchemrules/nitromethyl_sulfone.qry diff --git a/contrib/data/queries/medchemrules/nitrone.qry b/data/queries/medchemrules/nitrone.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitrone.qry rename to data/queries/medchemrules/nitrone.qry diff --git a/contrib/data/queries/medchemrules/nitrosamine.qry b/data/queries/medchemrules/nitrosamine.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitrosamine.qry rename to data/queries/medchemrules/nitrosamine.qry diff --git a/contrib/data/queries/medchemrules/nitroso.qry b/data/queries/medchemrules/nitroso.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitroso.qry rename to data/queries/medchemrules/nitroso.qry diff --git a/contrib/data/queries/medchemrules/nitrous_ester.qry b/data/queries/medchemrules/nitrous_ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitrous_ester.qry rename to data/queries/medchemrules/nitrous_ester.qry diff --git a/contrib/data/queries/medchemrules/nitroxide.qry b/data/queries/medchemrules/nitroxide.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitroxide.qry rename to data/queries/medchemrules/nitroxide.qry diff --git a/contrib/data/queries/medchemrules/nitroxyl.qry b/data/queries/medchemrules/nitroxyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/nitroxyl.qry rename to data/queries/medchemrules/nitroxyl.qry diff --git a/contrib/data/queries/medchemrules/no_rings.qry b/data/queries/medchemrules/no_rings.qry similarity index 100% rename from contrib/data/queries/medchemrules/no_rings.qry rename to data/queries/medchemrules/no_rings.qry diff --git a/contrib/data/queries/medchemrules/non_ring_ketal.qry b/data/queries/medchemrules/non_ring_ketal.qry similarity index 100% rename from contrib/data/queries/medchemrules/non_ring_ketal.qry rename to data/queries/medchemrules/non_ring_ketal.qry diff --git a/contrib/data/queries/medchemrules/nso_2.qry b/data/queries/medchemrules/nso_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/nso_2.qry rename to data/queries/medchemrules/nso_2.qry diff --git a/contrib/data/queries/medchemrules/o_or_s_plus.qry b/data/queries/medchemrules/o_or_s_plus.qry similarity index 100% rename from contrib/data/queries/medchemrules/o_or_s_plus.qry rename to data/queries/medchemrules/o_or_s_plus.qry diff --git a/contrib/data/queries/medchemrules/orthonitropyridine.qry b/data/queries/medchemrules/orthonitropyridine.qry similarity index 100% rename from contrib/data/queries/medchemrules/orthonitropyridine.qry rename to data/queries/medchemrules/orthonitropyridine.qry diff --git a/contrib/data/queries/medchemrules/oxime.qry b/data/queries/medchemrules/oxime.qry similarity index 100% rename from contrib/data/queries/medchemrules/oxime.qry rename to data/queries/medchemrules/oxime.qry diff --git a/contrib/data/queries/medchemrules/oxiridine.qry b/data/queries/medchemrules/oxiridine.qry similarity index 100% rename from contrib/data/queries/medchemrules/oxiridine.qry rename to data/queries/medchemrules/oxiridine.qry diff --git a/contrib/data/queries/medchemrules/penicillin_cephalosporin.qry b/data/queries/medchemrules/penicillin_cephalosporin.qry similarity index 100% rename from contrib/data/queries/medchemrules/penicillin_cephalosporin.qry rename to data/queries/medchemrules/penicillin_cephalosporin.qry diff --git a/contrib/data/queries/medchemrules/perchlorate.qry b/data/queries/medchemrules/perchlorate.qry similarity index 100% rename from contrib/data/queries/medchemrules/perchlorate.qry rename to data/queries/medchemrules/perchlorate.qry diff --git a/contrib/data/queries/medchemrules/perimidine.qry b/data/queries/medchemrules/perimidine.qry similarity index 100% rename from contrib/data/queries/medchemrules/perimidine.qry rename to data/queries/medchemrules/perimidine.qry diff --git a/contrib/data/queries/medchemrules/peroxide.qry b/data/queries/medchemrules/peroxide.qry similarity index 100% rename from contrib/data/queries/medchemrules/peroxide.qry rename to data/queries/medchemrules/peroxide.qry diff --git a/contrib/data/queries/medchemrules/phenanthrene_het.qry b/data/queries/medchemrules/phenanthrene_het.qry similarity index 100% rename from contrib/data/queries/medchemrules/phenanthrene_het.qry rename to data/queries/medchemrules/phenanthrene_het.qry diff --git a/contrib/data/queries/medchemrules/phenol_phosphate_ester.qry b/data/queries/medchemrules/phenol_phosphate_ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/phenol_phosphate_ester.qry rename to data/queries/medchemrules/phenol_phosphate_ester.qry diff --git a/contrib/data/queries/medchemrules/phenolate.qry b/data/queries/medchemrules/phenolate.qry similarity index 100% rename from contrib/data/queries/medchemrules/phenolate.qry rename to data/queries/medchemrules/phenolate.qry diff --git a/contrib/data/queries/medchemrules/phenolic_ester_or_carbamate.qry b/data/queries/medchemrules/phenolic_ester_or_carbamate.qry similarity index 100% rename from contrib/data/queries/medchemrules/phenolic_ester_or_carbamate.qry rename to data/queries/medchemrules/phenolic_ester_or_carbamate.qry diff --git a/contrib/data/queries/medchemrules/phenylenediamine.qry b/data/queries/medchemrules/phenylenediamine.qry similarity index 100% rename from contrib/data/queries/medchemrules/phenylenediamine.qry rename to data/queries/medchemrules/phenylenediamine.qry diff --git a/contrib/data/queries/medchemrules/phosphate_ester.qry b/data/queries/medchemrules/phosphate_ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/phosphate_ester.qry rename to data/queries/medchemrules/phosphate_ester.qry diff --git a/contrib/data/queries/medchemrules/phosphate_ester_ian_echo.qry b/data/queries/medchemrules/phosphate_ester_ian_echo.qry similarity index 100% rename from contrib/data/queries/medchemrules/phosphate_ester_ian_echo.qry rename to data/queries/medchemrules/phosphate_ester_ian_echo.qry diff --git a/contrib/data/queries/medchemrules/phosphoric_acid.qry b/data/queries/medchemrules/phosphoric_acid.qry similarity index 100% rename from contrib/data/queries/medchemrules/phosphoric_acid.qry rename to data/queries/medchemrules/phosphoric_acid.qry diff --git a/contrib/data/queries/medchemrules/phthalimide.qry b/data/queries/medchemrules/phthalimide.qry similarity index 100% rename from contrib/data/queries/medchemrules/phthalimide.qry rename to data/queries/medchemrules/phthalimide.qry diff --git a/contrib/data/queries/medchemrules/po4.qry b/data/queries/medchemrules/po4.qry similarity index 100% rename from contrib/data/queries/medchemrules/po4.qry rename to data/queries/medchemrules/po4.qry diff --git a/contrib/data/queries/medchemrules/polyphenol.qry b/data/queries/medchemrules/polyphenol.qry similarity index 100% rename from contrib/data/queries/medchemrules/polyphenol.qry rename to data/queries/medchemrules/polyphenol.qry diff --git a/contrib/data/queries/medchemrules/pyridazine_dione.qry b/data/queries/medchemrules/pyridazine_dione.qry similarity index 100% rename from contrib/data/queries/medchemrules/pyridazine_dione.qry rename to data/queries/medchemrules/pyridazine_dione.qry diff --git a/contrib/data/queries/medchemrules/pyrrole.qry b/data/queries/medchemrules/pyrrole.qry similarity index 100% rename from contrib/data/queries/medchemrules/pyrrole.qry rename to data/queries/medchemrules/pyrrole.qry diff --git a/contrib/data/queries/medchemrules/pyrrole_vinylidene.qry b/data/queries/medchemrules/pyrrole_vinylidene.qry similarity index 100% rename from contrib/data/queries/medchemrules/pyrrole_vinylidene.qry rename to data/queries/medchemrules/pyrrole_vinylidene.qry diff --git a/contrib/data/queries/medchemrules/q.tar b/data/queries/medchemrules/q.tar similarity index 100% rename from contrib/data/queries/medchemrules/q.tar rename to data/queries/medchemrules/q.tar diff --git a/contrib/data/queries/medchemrules/qry2json.rb b/data/queries/medchemrules/qry2json.rb similarity index 100% rename from contrib/data/queries/medchemrules/qry2json.rb rename to data/queries/medchemrules/qry2json.rb diff --git a/contrib/data/queries/medchemrules/quat_n_heteroatom.qry b/data/queries/medchemrules/quat_n_heteroatom.qry similarity index 100% rename from contrib/data/queries/medchemrules/quat_n_heteroatom.qry rename to data/queries/medchemrules/quat_n_heteroatom.qry diff --git a/contrib/data/queries/medchemrules/quat_schiff_base.qry b/data/queries/medchemrules/quat_schiff_base.qry similarity index 100% rename from contrib/data/queries/medchemrules/quat_schiff_base.qry rename to data/queries/medchemrules/quat_schiff_base.qry diff --git a/contrib/data/queries/medchemrules/quaternary_amine.qry b/data/queries/medchemrules/quaternary_amine.qry similarity index 100% rename from contrib/data/queries/medchemrules/quaternary_amine.qry rename to data/queries/medchemrules/quaternary_amine.qry diff --git a/contrib/data/queries/medchemrules/quaternary_aryl.qry b/data/queries/medchemrules/quaternary_aryl.qry similarity index 100% rename from contrib/data/queries/medchemrules/quaternary_aryl.qry rename to data/queries/medchemrules/quaternary_aryl.qry diff --git a/contrib/data/queries/medchemrules/queries b/data/queries/medchemrules/queries similarity index 100% rename from contrib/data/queries/medchemrules/queries rename to data/queries/medchemrules/queries diff --git a/contrib/data/queries/medchemrules/quinone_methide.qry b/data/queries/medchemrules/quinone_methide.qry similarity index 100% rename from contrib/data/queries/medchemrules/quinone_methide.qry rename to data/queries/medchemrules/quinone_methide.qry diff --git a/contrib/data/queries/medchemrules/quinone_para.qry b/data/queries/medchemrules/quinone_para.qry similarity index 100% rename from contrib/data/queries/medchemrules/quinone_para.qry rename to data/queries/medchemrules/quinone_para.qry diff --git a/contrib/data/queries/medchemrules/reject1 b/data/queries/medchemrules/reject1 similarity index 100% rename from contrib/data/queries/medchemrules/reject1 rename to data/queries/medchemrules/reject1 diff --git a/contrib/data/queries/medchemrules/reject2 b/data/queries/medchemrules/reject2 similarity index 100% rename from contrib/data/queries/medchemrules/reject2 rename to data/queries/medchemrules/reject2 diff --git a/contrib/data/queries/medchemrules/reverse_michael.qry b/data/queries/medchemrules/reverse_michael.qry similarity index 100% rename from contrib/data/queries/medchemrules/reverse_michael.qry rename to data/queries/medchemrules/reverse_michael.qry diff --git a/contrib/data/queries/medchemrules/reverse_michael_demerit.qry b/data/queries/medchemrules/reverse_michael_demerit.qry similarity index 100% rename from contrib/data/queries/medchemrules/reverse_michael_demerit.qry rename to data/queries/medchemrules/reverse_michael_demerit.qry diff --git a/contrib/data/queries/medchemrules/reverse_michael_quat.qry b/data/queries/medchemrules/reverse_michael_quat.qry similarity index 100% rename from contrib/data/queries/medchemrules/reverse_michael_quat.qry rename to data/queries/medchemrules/reverse_michael_quat.qry diff --git a/contrib/data/queries/medchemrules/rhodanine.qry b/data/queries/medchemrules/rhodanine.qry similarity index 100% rename from contrib/data/queries/medchemrules/rhodanine.qry rename to data/queries/medchemrules/rhodanine.qry diff --git a/contrib/data/queries/medchemrules/ring_system_too_large.qry b/data/queries/medchemrules/ring_system_too_large.qry similarity index 100% rename from contrib/data/queries/medchemrules/ring_system_too_large.qry rename to data/queries/medchemrules/ring_system_too_large.qry diff --git a/contrib/data/queries/medchemrules/ring_system_too_large_with_aromatic.qry b/data/queries/medchemrules/ring_system_too_large_with_aromatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/ring_system_too_large_with_aromatic.qry rename to data/queries/medchemrules/ring_system_too_large_with_aromatic.qry diff --git a/contrib/data/queries/medchemrules/s_4_single_bonds.qry b/data/queries/medchemrules/s_4_single_bonds.qry similarity index 100% rename from contrib/data/queries/medchemrules/s_4_single_bonds.qry rename to data/queries/medchemrules/s_4_single_bonds.qry diff --git a/contrib/data/queries/medchemrules/scf3.qry b/data/queries/medchemrules/scf3.qry similarity index 100% rename from contrib/data/queries/medchemrules/scf3.qry rename to data/queries/medchemrules/scf3.qry diff --git a/contrib/data/queries/medchemrules/sch2s.qry b/data/queries/medchemrules/sch2s.qry similarity index 100% rename from contrib/data/queries/medchemrules/sch2s.qry rename to data/queries/medchemrules/sch2s.qry diff --git a/contrib/data/queries/medchemrules/schiff_base.qry b/data/queries/medchemrules/schiff_base.qry similarity index 100% rename from contrib/data/queries/medchemrules/schiff_base.qry rename to data/queries/medchemrules/schiff_base.qry diff --git a/contrib/data/queries/medchemrules/scscs.qry b/data/queries/medchemrules/scscs.qry similarity index 100% rename from contrib/data/queries/medchemrules/scscs.qry rename to data/queries/medchemrules/scscs.qry diff --git a/contrib/data/queries/medchemrules/so.qry b/data/queries/medchemrules/so.qry similarity index 100% rename from contrib/data/queries/medchemrules/so.qry rename to data/queries/medchemrules/so.qry diff --git a/contrib/data/queries/medchemrules/ss.qry b/data/queries/medchemrules/ss.qry similarity index 100% rename from contrib/data/queries/medchemrules/ss.qry rename to data/queries/medchemrules/ss.qry diff --git a/contrib/data/queries/medchemrules/steve1.qry b/data/queries/medchemrules/steve1.qry similarity index 100% rename from contrib/data/queries/medchemrules/steve1.qry rename to data/queries/medchemrules/steve1.qry diff --git a/contrib/data/queries/medchemrules/strongly_fused_ring_system.qry b/data/queries/medchemrules/strongly_fused_ring_system.qry similarity index 100% rename from contrib/data/queries/medchemrules/strongly_fused_ring_system.qry rename to data/queries/medchemrules/strongly_fused_ring_system.qry diff --git a/contrib/data/queries/medchemrules/sulfimine.qry b/data/queries/medchemrules/sulfimine.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfimine.qry rename to data/queries/medchemrules/sulfimine.qry diff --git a/contrib/data/queries/medchemrules/sulfonamide_methylene_sulfone.qry b/data/queries/medchemrules/sulfonamide_methylene_sulfone.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonamide_methylene_sulfone.qry rename to data/queries/medchemrules/sulfonamide_methylene_sulfone.qry diff --git a/contrib/data/queries/medchemrules/sulfonic_acid.qry b/data/queries/medchemrules/sulfonic_acid.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonic_acid.qry rename to data/queries/medchemrules/sulfonic_acid.qry diff --git a/contrib/data/queries/medchemrules/sulfonium.qry b/data/queries/medchemrules/sulfonium.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonium.qry rename to data/queries/medchemrules/sulfonium.qry diff --git a/contrib/data/queries/medchemrules/sulfonyl_ester.qry b/data/queries/medchemrules/sulfonyl_ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonyl_ester.qry rename to data/queries/medchemrules/sulfonyl_ester.qry diff --git a/contrib/data/queries/medchemrules/sulfonyl_halide.qry b/data/queries/medchemrules/sulfonyl_halide.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonyl_halide.qry rename to data/queries/medchemrules/sulfonyl_halide.qry diff --git a/contrib/data/queries/medchemrules/sulfonyl_hydrazone.qry b/data/queries/medchemrules/sulfonyl_hydrazone.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonyl_hydrazone.qry rename to data/queries/medchemrules/sulfonyl_hydrazone.qry diff --git a/contrib/data/queries/medchemrules/sulfonyl_imine.qry b/data/queries/medchemrules/sulfonyl_imine.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonyl_imine.qry rename to data/queries/medchemrules/sulfonyl_imine.qry diff --git a/contrib/data/queries/medchemrules/sulfonyl_n_aromatic_edg.qry b/data/queries/medchemrules/sulfonyl_n_aromatic_edg.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonyl_n_aromatic_edg.qry rename to data/queries/medchemrules/sulfonyl_n_aromatic_edg.qry diff --git a/contrib/data/queries/medchemrules/sulfonyl_n_aromatic_nedg.qry b/data/queries/medchemrules/sulfonyl_n_aromatic_nedg.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonyl_n_aromatic_nedg.qry rename to data/queries/medchemrules/sulfonyl_n_aromatic_nedg.qry diff --git a/contrib/data/queries/medchemrules/sulfonyl_urea.qry b/data/queries/medchemrules/sulfonyl_urea.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonyl_urea.qry rename to data/queries/medchemrules/sulfonyl_urea.qry diff --git a/contrib/data/queries/medchemrules/sulfonylmichael.qry b/data/queries/medchemrules/sulfonylmichael.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfonylmichael.qry rename to data/queries/medchemrules/sulfonylmichael.qry diff --git a/contrib/data/queries/medchemrules/sulfoxide_imine.qry b/data/queries/medchemrules/sulfoxide_imine.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulfoxide_imine.qry rename to data/queries/medchemrules/sulfoxide_imine.qry diff --git a/contrib/data/queries/medchemrules/sulphur.qry b/data/queries/medchemrules/sulphur.qry similarity index 100% rename from contrib/data/queries/medchemrules/sulphur.qry rename to data/queries/medchemrules/sulphur.qry diff --git a/contrib/data/queries/medchemrules/tbutyl.qry b/data/queries/medchemrules/tbutyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/tbutyl.qry rename to data/queries/medchemrules/tbutyl.qry diff --git a/contrib/data/queries/medchemrules/thio_aminal_acyclic.qry b/data/queries/medchemrules/thio_aminal_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thio_aminal_acyclic.qry rename to data/queries/medchemrules/thio_aminal_acyclic.qry diff --git a/contrib/data/queries/medchemrules/thio_ester_thione_acyclic.qry b/data/queries/medchemrules/thio_ester_thione_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thio_ester_thione_acyclic.qry rename to data/queries/medchemrules/thio_ester_thione_acyclic.qry diff --git a/contrib/data/queries/medchemrules/thio_ester_thione_cyclic.qry b/data/queries/medchemrules/thio_ester_thione_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thio_ester_thione_cyclic.qry rename to data/queries/medchemrules/thio_ester_thione_cyclic.qry diff --git a/contrib/data/queries/medchemrules/thio_oxime.qry b/data/queries/medchemrules/thio_oxime.qry similarity index 100% rename from contrib/data/queries/medchemrules/thio_oxime.qry rename to data/queries/medchemrules/thio_oxime.qry diff --git a/contrib/data/queries/medchemrules/thioacetal_acyclic.qry b/data/queries/medchemrules/thioacetal_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioacetal_acyclic.qry rename to data/queries/medchemrules/thioacetal_acyclic.qry diff --git a/contrib/data/queries/medchemrules/thioaminal_C_cyclic.qry b/data/queries/medchemrules/thioaminal_C_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioaminal_C_cyclic.qry rename to data/queries/medchemrules/thioaminal_C_cyclic.qry diff --git a/contrib/data/queries/medchemrules/thioaminal_n_sub_cyclic_2.qry b/data/queries/medchemrules/thioaminal_n_sub_cyclic_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioaminal_n_sub_cyclic_2.qry rename to data/queries/medchemrules/thioaminal_n_sub_cyclic_2.qry diff --git a/contrib/data/queries/medchemrules/thioaminal_n_unsub_cyclic_2.qry b/data/queries/medchemrules/thioaminal_n_unsub_cyclic_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioaminal_n_unsub_cyclic_2.qry rename to data/queries/medchemrules/thioaminal_n_unsub_cyclic_2.qry diff --git a/contrib/data/queries/medchemrules/thiocarbonyl_aromatic.qry b/data/queries/medchemrules/thiocarbonyl_aromatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiocarbonyl_aromatic.qry rename to data/queries/medchemrules/thiocarbonyl_aromatic.qry diff --git a/contrib/data/queries/medchemrules/thiocarbonyl_diester.qry b/data/queries/medchemrules/thiocarbonyl_diester.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiocarbonyl_diester.qry rename to data/queries/medchemrules/thiocarbonyl_diester.qry diff --git a/contrib/data/queries/medchemrules/thiocyanate.qry b/data/queries/medchemrules/thiocyanate.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiocyanate.qry rename to data/queries/medchemrules/thiocyanate.qry diff --git a/contrib/data/queries/medchemrules/thioester.qry b/data/queries/medchemrules/thioester.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioester.qry rename to data/queries/medchemrules/thioester.qry diff --git a/contrib/data/queries/medchemrules/thioester_acyclic.qry b/data/queries/medchemrules/thioester_acyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioester_acyclic.qry rename to data/queries/medchemrules/thioester_acyclic.qry diff --git a/contrib/data/queries/medchemrules/thioester_acyclic_aliphatic.qry b/data/queries/medchemrules/thioester_acyclic_aliphatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioester_acyclic_aliphatic.qry rename to data/queries/medchemrules/thioester_acyclic_aliphatic.qry diff --git a/contrib/data/queries/medchemrules/thioester_acyclic_aromatic.qry b/data/queries/medchemrules/thioester_acyclic_aromatic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioester_acyclic_aromatic.qry rename to data/queries/medchemrules/thioester_acyclic_aromatic.qry diff --git a/contrib/data/queries/medchemrules/thioester_cyclic.qry b/data/queries/medchemrules/thioester_cyclic.qry similarity index 100% rename from contrib/data/queries/medchemrules/thioester_cyclic.qry rename to data/queries/medchemrules/thioester_cyclic.qry diff --git a/contrib/data/queries/medchemrules/thiohydrazide.qry b/data/queries/medchemrules/thiohydrazide.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiohydrazide.qry rename to data/queries/medchemrules/thiohydrazide.qry diff --git a/contrib/data/queries/medchemrules/thiol.qry b/data/queries/medchemrules/thiol.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiol.qry rename to data/queries/medchemrules/thiol.qry diff --git a/contrib/data/queries/medchemrules/thiomethyl_ketone.qry b/data/queries/medchemrules/thiomethyl_ketone.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiomethyl_ketone.qry rename to data/queries/medchemrules/thiomethyl_ketone.qry diff --git a/contrib/data/queries/medchemrules/thione.qry b/data/queries/medchemrules/thione.qry similarity index 100% rename from contrib/data/queries/medchemrules/thione.qry rename to data/queries/medchemrules/thione.qry diff --git a/contrib/data/queries/medchemrules/thione_oxide.qry b/data/queries/medchemrules/thione_oxide.qry similarity index 100% rename from contrib/data/queries/medchemrules/thione_oxide.qry rename to data/queries/medchemrules/thione_oxide.qry diff --git a/contrib/data/queries/medchemrules/thiophene_furan_n_acyl.qry b/data/queries/medchemrules/thiophene_furan_n_acyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiophene_furan_n_acyl.qry rename to data/queries/medchemrules/thiophene_furan_n_acyl.qry diff --git a/contrib/data/queries/medchemrules/thiophene_furan_nh.qry b/data/queries/medchemrules/thiophene_furan_nh.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiophene_furan_nh.qry rename to data/queries/medchemrules/thiophene_furan_nh.qry diff --git a/contrib/data/queries/medchemrules/thiourea.qry b/data/queries/medchemrules/thiourea.qry similarity index 100% rename from contrib/data/queries/medchemrules/thiourea.qry rename to data/queries/medchemrules/thiourea.qry diff --git a/contrib/data/queries/medchemrules/too_many_aromatic_rings_in_ring_system.qry b/data/queries/medchemrules/too_many_aromatic_rings_in_ring_system.qry similarity index 100% rename from contrib/data/queries/medchemrules/too_many_aromatic_rings_in_ring_system.qry rename to data/queries/medchemrules/too_many_aromatic_rings_in_ring_system.qry diff --git a/contrib/data/queries/medchemrules/too_many_sulfonate.qry b/data/queries/medchemrules/too_many_sulfonate.qry similarity index 100% rename from contrib/data/queries/medchemrules/too_many_sulfonate.qry rename to data/queries/medchemrules/too_many_sulfonate.qry diff --git a/contrib/data/queries/medchemrules/triflate.qry b/data/queries/medchemrules/triflate.qry similarity index 100% rename from contrib/data/queries/medchemrules/triflate.qry rename to data/queries/medchemrules/triflate.qry diff --git a/contrib/data/queries/medchemrules/trifluoroacetate_ester.qry b/data/queries/medchemrules/trifluoroacetate_ester.qry similarity index 100% rename from contrib/data/queries/medchemrules/trifluoroacetate_ester.qry rename to data/queries/medchemrules/trifluoroacetate_ester.qry diff --git a/contrib/data/queries/medchemrules/trifluoroborate.qry b/data/queries/medchemrules/trifluoroborate.qry similarity index 100% rename from contrib/data/queries/medchemrules/trifluoroborate.qry rename to data/queries/medchemrules/trifluoroborate.qry diff --git a/contrib/data/queries/medchemrules/triphenylmethyl.qry b/data/queries/medchemrules/triphenylmethyl.qry similarity index 100% rename from contrib/data/queries/medchemrules/triphenylmethyl.qry rename to data/queries/medchemrules/triphenylmethyl.qry diff --git a/contrib/data/queries/medchemrules/trivalent_phosphorus.qry b/data/queries/medchemrules/trivalent_phosphorus.qry similarity index 100% rename from contrib/data/queries/medchemrules/trivalent_phosphorus.qry rename to data/queries/medchemrules/trivalent_phosphorus.qry diff --git a/contrib/data/queries/medchemrules/tropolone.qry b/data/queries/medchemrules/tropolone.qry similarity index 100% rename from contrib/data/queries/medchemrules/tropolone.qry rename to data/queries/medchemrules/tropolone.qry diff --git a/contrib/data/queries/medchemrules/unsat_n_plus.qry b/data/queries/medchemrules/unsat_n_plus.qry similarity index 100% rename from contrib/data/queries/medchemrules/unsat_n_plus.qry rename to data/queries/medchemrules/unsat_n_plus.qry diff --git a/contrib/data/queries/medchemrules/vinyl_cyano_2.qry b/data/queries/medchemrules/vinyl_cyano_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_cyano_2.qry rename to data/queries/medchemrules/vinyl_cyano_2.qry diff --git a/contrib/data/queries/medchemrules/vinyl_cyano_het.qry b/data/queries/medchemrules/vinyl_cyano_het.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_cyano_het.qry rename to data/queries/medchemrules/vinyl_cyano_het.qry diff --git a/contrib/data/queries/medchemrules/vinyl_disulfide.qry b/data/queries/medchemrules/vinyl_disulfide.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_disulfide.qry rename to data/queries/medchemrules/vinyl_disulfide.qry diff --git a/contrib/data/queries/medchemrules/vinyl_disulfone.qry b/data/queries/medchemrules/vinyl_disulfone.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_disulfone.qry rename to data/queries/medchemrules/vinyl_disulfone.qry diff --git a/contrib/data/queries/medchemrules/vinyl_disulfur.qry b/data/queries/medchemrules/vinyl_disulfur.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_disulfur.qry rename to data/queries/medchemrules/vinyl_disulfur.qry diff --git a/contrib/data/queries/medchemrules/vinyl_ether.qry b/data/queries/medchemrules/vinyl_ether.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_ether.qry rename to data/queries/medchemrules/vinyl_ether.qry diff --git a/contrib/data/queries/medchemrules/vinyl_ether_thioate_isoamide.qry b/data/queries/medchemrules/vinyl_ether_thioate_isoamide.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_ether_thioate_isoamide.qry rename to data/queries/medchemrules/vinyl_ether_thioate_isoamide.qry diff --git a/contrib/data/queries/medchemrules/vinyl_halide_2_halogens.qry b/data/queries/medchemrules/vinyl_halide_2_halogens.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_halide_2_halogens.qry rename to data/queries/medchemrules/vinyl_halide_2_halogens.qry diff --git a/contrib/data/queries/medchemrules/vinyl_halide_3_halogens.qry b/data/queries/medchemrules/vinyl_halide_3_halogens.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_halide_3_halogens.qry rename to data/queries/medchemrules/vinyl_halide_3_halogens.qry diff --git a/contrib/data/queries/medchemrules/vinyl_nitro.qry b/data/queries/medchemrules/vinyl_nitro.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_nitro.qry rename to data/queries/medchemrules/vinyl_nitro.qry diff --git a/contrib/data/queries/medchemrules/vinyl_sulfone_2.qry b/data/queries/medchemrules/vinyl_sulfone_2.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_sulfone_2.qry rename to data/queries/medchemrules/vinyl_sulfone_2.qry diff --git a/contrib/data/queries/medchemrules/vinyl_sulfone_3.qry b/data/queries/medchemrules/vinyl_sulfone_3.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_sulfone_3.qry rename to data/queries/medchemrules/vinyl_sulfone_3.qry diff --git a/contrib/data/queries/medchemrules/vinyl_sulfoxide.qry b/data/queries/medchemrules/vinyl_sulfoxide.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_sulfoxide.qry rename to data/queries/medchemrules/vinyl_sulfoxide.qry diff --git a/contrib/data/queries/medchemrules/vinyl_sulphide.qry b/data/queries/medchemrules/vinyl_sulphide.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_sulphide.qry rename to data/queries/medchemrules/vinyl_sulphide.qry diff --git a/contrib/data/queries/medchemrules/vinyl_thioether.qry b/data/queries/medchemrules/vinyl_thioether.qry similarity index 100% rename from contrib/data/queries/medchemrules/vinyl_thioether.qry rename to data/queries/medchemrules/vinyl_thioether.qry diff --git a/contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polybrominated_ring.qry b/data/queries/molAttractiveness/PolyHalogenatedRings/polybrominated_ring.qry similarity index 100% rename from contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polybrominated_ring.qry rename to data/queries/molAttractiveness/PolyHalogenatedRings/polybrominated_ring.qry diff --git a/contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring.qry b/data/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring.qry similarity index 100% rename from contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring.qry rename to data/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring.qry diff --git a/contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring_system.qry b/data/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring_system.qry similarity index 100% rename from contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring_system.qry rename to data/queries/molAttractiveness/PolyHalogenatedRings/polychlorinated_ring_system.qry diff --git a/contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polyfluorinated_ring.qry b/data/queries/molAttractiveness/PolyHalogenatedRings/polyfluorinated_ring.qry similarity index 100% rename from contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polyfluorinated_ring.qry rename to data/queries/molAttractiveness/PolyHalogenatedRings/polyfluorinated_ring.qry diff --git a/contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polyhalogenated_queries.list b/data/queries/molAttractiveness/PolyHalogenatedRings/polyhalogenated_queries.list similarity index 100% rename from contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polyhalogenated_queries.list rename to data/queries/molAttractiveness/PolyHalogenatedRings/polyhalogenated_queries.list diff --git a/contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polyiodinated_ring.qry b/data/queries/molAttractiveness/PolyHalogenatedRings/polyiodinated_ring.qry similarity index 100% rename from contrib/data/queries/molAttractiveness/PolyHalogenatedRings/polyiodinated_ring.qry rename to data/queries/molAttractiveness/PolyHalogenatedRings/polyiodinated_ring.qry diff --git a/contrib/data/queries/molAttractiveness/StronglyFusedRings/strongly_fused.qry b/data/queries/molAttractiveness/StronglyFusedRings/strongly_fused.qry similarity index 100% rename from contrib/data/queries/molAttractiveness/StronglyFusedRings/strongly_fused.qry rename to data/queries/molAttractiveness/StronglyFusedRings/strongly_fused.qry diff --git a/contrib/data/queries/molAttractiveness/StronglyFusedRings/strongly_fused_rings.qry b/data/queries/molAttractiveness/StronglyFusedRings/strongly_fused_rings.qry similarity index 100% rename from contrib/data/queries/molAttractiveness/StronglyFusedRings/strongly_fused_rings.qry rename to data/queries/molAttractiveness/StronglyFusedRings/strongly_fused_rings.qry diff --git a/contrib/data/queries/molAttractiveness/StronglyFusedRings/whatwedid b/data/queries/molAttractiveness/StronglyFusedRings/whatwedid similarity index 100% rename from contrib/data/queries/molAttractiveness/StronglyFusedRings/whatwedid rename to data/queries/molAttractiveness/StronglyFusedRings/whatwedid diff --git a/contrib/data/queries/nouglymolecules/large_ring_system.qry b/data/queries/nouglymolecules/large_ring_system.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/large_ring_system.qry rename to data/queries/nouglymolecules/large_ring_system.qry diff --git a/contrib/data/queries/nouglymolecules/large_ring_system_3.qry b/data/queries/nouglymolecules/large_ring_system_3.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/large_ring_system_3.qry rename to data/queries/nouglymolecules/large_ring_system_3.qry diff --git a/contrib/data/queries/nouglymolecules/large_ring_system_4.qry b/data/queries/nouglymolecules/large_ring_system_4.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/large_ring_system_4.qry rename to data/queries/nouglymolecules/large_ring_system_4.qry diff --git a/contrib/data/queries/nouglymolecules/large_ring_system_5.qry b/data/queries/nouglymolecules/large_ring_system_5.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/large_ring_system_5.qry rename to data/queries/nouglymolecules/large_ring_system_5.qry diff --git a/contrib/data/queries/nouglymolecules/large_ring_system_6.qry b/data/queries/nouglymolecules/large_ring_system_6.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/large_ring_system_6.qry rename to data/queries/nouglymolecules/large_ring_system_6.qry diff --git a/contrib/data/queries/nouglymolecules/large_ring_system_7.qry b/data/queries/nouglymolecules/large_ring_system_7.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/large_ring_system_7.qry rename to data/queries/nouglymolecules/large_ring_system_7.qry diff --git a/contrib/data/queries/nouglymolecules/polyfluorinated.qry b/data/queries/nouglymolecules/polyfluorinated.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/polyfluorinated.qry rename to data/queries/nouglymolecules/polyfluorinated.qry diff --git a/contrib/data/queries/nouglymolecules/spiro.qry b/data/queries/nouglymolecules/spiro.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/spiro.qry rename to data/queries/nouglymolecules/spiro.qry diff --git a/contrib/data/queries/nouglymolecules/spiro_sys.qry b/data/queries/nouglymolecules/spiro_sys.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/spiro_sys.qry rename to data/queries/nouglymolecules/spiro_sys.qry diff --git a/contrib/data/queries/nouglymolecules/strongly_fused.qry b/data/queries/nouglymolecules/strongly_fused.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/strongly_fused.qry rename to data/queries/nouglymolecules/strongly_fused.qry diff --git a/contrib/data/queries/nouglymolecules/strongly_fused.s1 b/data/queries/nouglymolecules/strongly_fused.s1 similarity index 100% rename from contrib/data/queries/nouglymolecules/strongly_fused.s1 rename to data/queries/nouglymolecules/strongly_fused.s1 diff --git a/contrib/data/queries/nouglymolecules/too_many_rings.qry b/data/queries/nouglymolecules/too_many_rings.qry similarity index 100% rename from contrib/data/queries/nouglymolecules/too_many_rings.qry rename to data/queries/nouglymolecules/too_many_rings.qry diff --git a/contrib/data/queries/pharmacophore/hydrophobe2.qry b/data/queries/pharmacophore/hydrophobe2.qry similarity index 100% rename from contrib/data/queries/pharmacophore/hydrophobe2.qry rename to data/queries/pharmacophore/hydrophobe2.qry diff --git a/contrib/data/queries/pharmacophore/pharmacophore b/data/queries/pharmacophore/pharmacophore similarity index 100% rename from contrib/data/queries/pharmacophore/pharmacophore rename to data/queries/pharmacophore/pharmacophore diff --git a/contrib/data/queries/zof/between_rings.qry b/data/queries/zof/between_rings.qry similarity index 100% rename from contrib/data/queries/zof/between_rings.qry rename to data/queries/zof/between_rings.qry diff --git a/contrib/data/queries/zof/coumarin.qry b/data/queries/zof/coumarin.qry similarity index 100% rename from contrib/data/queries/zof/coumarin.qry rename to data/queries/zof/coumarin.qry diff --git a/contrib/data/queries/zof/dimethyl_ring.qry b/data/queries/zof/dimethyl_ring.qry similarity index 100% rename from contrib/data/queries/zof/dimethyl_ring.qry rename to data/queries/zof/dimethyl_ring.qry diff --git a/contrib/data/queries/zof/disubstituted.qry b/data/queries/zof/disubstituted.qry similarity index 100% rename from contrib/data/queries/zof/disubstituted.qry rename to data/queries/zof/disubstituted.qry diff --git a/contrib/data/queries/zof/ester.qry b/data/queries/zof/ester.qry similarity index 100% rename from contrib/data/queries/zof/ester.qry rename to data/queries/zof/ester.qry diff --git a/contrib/data/queries/zof/floppy.qry b/data/queries/zof/floppy.qry similarity index 100% rename from contrib/data/queries/zof/floppy.qry rename to data/queries/zof/floppy.qry diff --git a/contrib/data/queries/zof/multiple_anilines.qry b/data/queries/zof/multiple_anilines.qry similarity index 100% rename from contrib/data/queries/zof/multiple_anilines.qry rename to data/queries/zof/multiple_anilines.qry diff --git a/contrib/data/queries/zof/multiple_halogen_on_one_ring.qry b/data/queries/zof/multiple_halogen_on_one_ring.qry similarity index 100% rename from contrib/data/queries/zof/multiple_halogen_on_one_ring.qry rename to data/queries/zof/multiple_halogen_on_one_ring.qry diff --git a/contrib/data/queries/zof/multiple_large_ring_systems.qry b/data/queries/zof/multiple_large_ring_systems.qry similarity index 100% rename from contrib/data/queries/zof/multiple_large_ring_systems.qry rename to data/queries/zof/multiple_large_ring_systems.qry diff --git a/contrib/data/queries/zof/polyhalogenated_ring.qry b/data/queries/zof/polyhalogenated_ring.qry similarity index 100% rename from contrib/data/queries/zof/polyhalogenated_ring.qry rename to data/queries/zof/polyhalogenated_ring.qry diff --git a/contrib/data/queries/zof/pyrrole.qry b/data/queries/zof/pyrrole.qry similarity index 100% rename from contrib/data/queries/zof/pyrrole.qry rename to data/queries/zof/pyrrole.qry diff --git a/contrib/data/queries/zof/reverse_coumarin.qry b/data/queries/zof/reverse_coumarin.qry similarity index 100% rename from contrib/data/queries/zof/reverse_coumarin.qry rename to data/queries/zof/reverse_coumarin.qry diff --git a/contrib/data/queries/zof/ring_substitution.qry b/data/queries/zof/ring_substitution.qry similarity index 100% rename from contrib/data/queries/zof/ring_substitution.qry rename to data/queries/zof/ring_substitution.qry diff --git a/contrib/data/queries/zof/strained_6arom4.qry b/data/queries/zof/strained_6arom4.qry similarity index 100% rename from contrib/data/queries/zof/strained_6arom4.qry rename to data/queries/zof/strained_6arom4.qry diff --git a/contrib/data/queries/zof/strongly_fused_ring.qry b/data/queries/zof/strongly_fused_ring.qry similarity index 100% rename from contrib/data/queries/zof/strongly_fused_ring.qry rename to data/queries/zof/strongly_fused_ring.qry diff --git a/contrib/data/queries/zof/too_much_ring_spinach.qry b/data/queries/zof/too_much_ring_spinach.qry similarity index 100% rename from contrib/data/queries/zof/too_much_ring_spinach.qry rename to data/queries/zof/too_much_ring_spinach.qry diff --git a/data/random_molecular_permutations.d/AAREADME.md b/data/random_molecular_permutations.d/AAREADME.md new file mode 100644 index 00000000..16be48e8 --- /dev/null +++ b/data/random_molecular_permutations.d/AAREADME.md @@ -0,0 +1,13 @@ +# random_geometric_transformations + +This directory holds fragment libraries that can be used with random_geometric_transformations.sh + +This is used by the scripts + +* random_molecular_permutations.sh +* graph_edit_changes.sh + +with each one using a different file of probabilities. + +Generally this works well, the code needs to be modermised and more attention +paid to valence errors - which should be avoidable. diff --git a/contrib/data/random_molecular_transformations.d/Fragments.rings_aliphatic.smi b/data/random_molecular_permutations.d/Fragments.rings_aliphatic.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/Fragments.rings_aliphatic.smi rename to data/random_molecular_permutations.d/Fragments.rings_aliphatic.smi diff --git a/contrib/data/random_molecular_transformations.d/Fragments.rings_aromatic.smi b/data/random_molecular_permutations.d/Fragments.rings_aromatic.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/Fragments.rings_aromatic.smi rename to data/random_molecular_permutations.d/Fragments.rings_aromatic.smi diff --git a/contrib/data/random_molecular_transformations.d/aliphatic_ring.smi b/data/random_molecular_permutations.d/aliphatic_ring.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/aliphatic_ring.smi rename to data/random_molecular_permutations.d/aliphatic_ring.smi diff --git a/contrib/data/random_molecular_transformations.d/aromatic_attachment_fragments.smi b/data/random_molecular_permutations.d/aromatic_attachment_fragments.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/aromatic_attachment_fragments.smi rename to data/random_molecular_permutations.d/aromatic_attachment_fragments.smi diff --git a/contrib/data/random_molecular_transformations.d/aromatic_ring.smi b/data/random_molecular_permutations.d/aromatic_ring.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/aromatic_ring.smi rename to data/random_molecular_permutations.d/aromatic_ring.smi diff --git a/contrib/data/random_molecular_transformations.d/double_attachment_fragments.smi b/data/random_molecular_permutations.d/double_attachment_fragments.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/double_attachment_fragments.smi rename to data/random_molecular_permutations.d/double_attachment_fragments.smi diff --git a/contrib/data/random_molecular_transformations.d/fuse_aromatic_ring.smi b/data/random_molecular_permutations.d/fuse_aromatic_ring.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/fuse_aromatic_ring.smi rename to data/random_molecular_permutations.d/fuse_aromatic_ring.smi diff --git a/contrib/data/random_molecular_transformations.d/graph_edit_changes b/data/random_molecular_permutations.d/graph_edit_changes similarity index 100% rename from contrib/data/random_molecular_transformations.d/graph_edit_changes rename to data/random_molecular_permutations.d/graph_edit_changes diff --git a/contrib/data/random_molecular_transformations.d/random_molecular_transformations b/data/random_molecular_permutations.d/random_molecular_transformations similarity index 100% rename from contrib/data/random_molecular_transformations.d/random_molecular_transformations rename to data/random_molecular_permutations.d/random_molecular_transformations diff --git a/contrib/data/random_molecular_transformations.d/single_attachment_fragments.smi b/data/random_molecular_permutations.d/single_attachment_fragments.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/single_attachment_fragments.smi rename to data/random_molecular_permutations.d/single_attachment_fragments.smi diff --git a/contrib/data/random_molecular_transformations.d/single_attachment_fragments_any_atom.smi b/data/random_molecular_permutations.d/single_attachment_fragments_any_atom.smi similarity index 100% rename from contrib/data/random_molecular_transformations.d/single_attachment_fragments_any_atom.smi rename to data/random_molecular_permutations.d/single_attachment_fragments_any_atom.smi diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_donor_acceptor.qry b/data/reduced_graph.donor_acceptor/aliphatic_donor_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_donor_acceptor.qry rename to data/reduced_graph.donor_acceptor/aliphatic_donor_acceptor.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.qry b/data/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.qry rename to data/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.txt b/data/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.txt rename to data/reduced_graph.donor_acceptor/aliphatic_ring_acceptor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_donor.qry b/data/reduced_graph.donor_acceptor/aliphatic_ring_donor.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_donor.qry rename to data/reduced_graph.donor_acceptor/aliphatic_ring_donor.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_donor.txt b/data/reduced_graph.donor_acceptor/aliphatic_ring_donor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_donor.txt rename to data/reduced_graph.donor_acceptor/aliphatic_ring_donor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.qry b/data/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.qry rename to data/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.txt b/data/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.txt rename to data/reduced_graph.donor_acceptor/aliphatic_ring_donor_acceptor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_negative.qry b/data/reduced_graph.donor_acceptor/aliphatic_ring_negative.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_negative.qry rename to data/reduced_graph.donor_acceptor/aliphatic_ring_negative.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_negative.txt b/data/reduced_graph.donor_acceptor/aliphatic_ring_negative.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_negative.txt rename to data/reduced_graph.donor_acceptor/aliphatic_ring_negative.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.qry b/data/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.qry rename to data/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.txt b/data/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.txt rename to data/reduced_graph.donor_acceptor/aliphatic_ring_non_feature.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_positive.qry b/data/reduced_graph.donor_acceptor/aliphatic_ring_positive.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_positive.qry rename to data/reduced_graph.donor_acceptor/aliphatic_ring_positive.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_positive.txt b/data/reduced_graph.donor_acceptor/aliphatic_ring_positive.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aliphatic_ring_positive.txt rename to data/reduced_graph.donor_acceptor/aliphatic_ring_positive.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_acceptor.qry b/data/reduced_graph.donor_acceptor/aromatic_ring_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_acceptor.qry rename to data/reduced_graph.donor_acceptor/aromatic_ring_acceptor.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_acceptor.txt b/data/reduced_graph.donor_acceptor/aromatic_ring_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_acceptor.txt rename to data/reduced_graph.donor_acceptor/aromatic_ring_acceptor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_donor.qry b/data/reduced_graph.donor_acceptor/aromatic_ring_donor.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_donor.qry rename to data/reduced_graph.donor_acceptor/aromatic_ring_donor.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_donor.txt b/data/reduced_graph.donor_acceptor/aromatic_ring_donor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_donor.txt rename to data/reduced_graph.donor_acceptor/aromatic_ring_donor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.qry b/data/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.qry rename to data/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.txt b/data/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.txt rename to data/reduced_graph.donor_acceptor/aromatic_ring_donor_acceptor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_negative.qry b/data/reduced_graph.donor_acceptor/aromatic_ring_negative.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_negative.qry rename to data/reduced_graph.donor_acceptor/aromatic_ring_negative.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_negative.txt b/data/reduced_graph.donor_acceptor/aromatic_ring_negative.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_negative.txt rename to data/reduced_graph.donor_acceptor/aromatic_ring_negative.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_non_feature.qry b/data/reduced_graph.donor_acceptor/aromatic_ring_non_feature.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_non_feature.qry rename to data/reduced_graph.donor_acceptor/aromatic_ring_non_feature.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_non_feature.txt b/data/reduced_graph.donor_acceptor/aromatic_ring_non_feature.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_non_feature.txt rename to data/reduced_graph.donor_acceptor/aromatic_ring_non_feature.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_positive.qry b/data/reduced_graph.donor_acceptor/aromatic_ring_positive.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_positive.qry rename to data/reduced_graph.donor_acceptor/aromatic_ring_positive.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/aromatic_ring_positive.txt b/data/reduced_graph.donor_acceptor/aromatic_ring_positive.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/aromatic_ring_positive.txt rename to data/reduced_graph.donor_acceptor/aromatic_ring_positive.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_acceptor.txt b/data/reduced_graph.donor_acceptor/feature_node_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_acceptor.txt rename to data/reduced_graph.donor_acceptor/feature_node_acceptor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_acceptor1.qry b/data/reduced_graph.donor_acceptor/feature_node_acceptor1.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_acceptor1.qry rename to data/reduced_graph.donor_acceptor/feature_node_acceptor1.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_acceptor2.qry b/data/reduced_graph.donor_acceptor/feature_node_acceptor2.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_acceptor2.qry rename to data/reduced_graph.donor_acceptor/feature_node_acceptor2.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_acceptor_nitro.qry b/data/reduced_graph.donor_acceptor/feature_node_acceptor_nitro.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_acceptor_nitro.qry rename to data/reduced_graph.donor_acceptor/feature_node_acceptor_nitro.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_acid.qry b/data/reduced_graph.donor_acceptor/feature_node_acid.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_acid.qry rename to data/reduced_graph.donor_acceptor/feature_node_acid.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_donor.txt b/data/reduced_graph.donor_acceptor/feature_node_donor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_donor.txt rename to data/reduced_graph.donor_acceptor/feature_node_donor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_donor1.qry b/data/reduced_graph.donor_acceptor/feature_node_donor1.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_donor1.qry rename to data/reduced_graph.donor_acceptor/feature_node_donor1.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_donor2.qry b/data/reduced_graph.donor_acceptor/feature_node_donor2.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_donor2.qry rename to data/reduced_graph.donor_acceptor/feature_node_donor2.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor.txt b/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor.txt rename to data/reduced_graph.donor_acceptor/feature_node_donor_acceptor.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor1.qry b/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor1.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor1.qry rename to data/reduced_graph.donor_acceptor/feature_node_donor_acceptor1.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor2.qry b/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor2.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_donor_acceptor2.qry rename to data/reduced_graph.donor_acceptor/feature_node_donor_acceptor2.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_negative.qry b/data/reduced_graph.donor_acceptor/feature_node_negative.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_negative.qry rename to data/reduced_graph.donor_acceptor/feature_node_negative.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_negative.txt b/data/reduced_graph.donor_acceptor/feature_node_negative.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_negative.txt rename to data/reduced_graph.donor_acceptor/feature_node_negative.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_positive.qry b/data/reduced_graph.donor_acceptor/feature_node_positive.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_positive.qry rename to data/reduced_graph.donor_acceptor/feature_node_positive.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/feature_node_positive.txt b/data/reduced_graph.donor_acceptor/feature_node_positive.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/feature_node_positive.txt rename to data/reduced_graph.donor_acceptor/feature_node_positive.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/link_node.qry b/data/reduced_graph.donor_acceptor/link_node.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/link_node.qry rename to data/reduced_graph.donor_acceptor/link_node.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/link_node.txt b/data/reduced_graph.donor_acceptor/link_node.txt similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/link_node.txt rename to data/reduced_graph.donor_acceptor/link_node.txt diff --git a/contrib/data/reduced_graph.donor_acceptor/phenyl.qry b/data/reduced_graph.donor_acceptor/phenyl.qry similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/phenyl.qry rename to data/reduced_graph.donor_acceptor/phenyl.qry diff --git a/contrib/data/reduced_graph.donor_acceptor/reductions b/data/reduced_graph.donor_acceptor/reductions similarity index 100% rename from contrib/data/reduced_graph.donor_acceptor/reductions rename to data/reduced_graph.donor_acceptor/reductions diff --git a/contrib/data/reduced_graph/aliphatic_donor_acceptor.qry b/data/reduced_graph/aliphatic_donor_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph/aliphatic_donor_acceptor.qry rename to data/reduced_graph/aliphatic_donor_acceptor.qry diff --git a/contrib/data/reduced_graph/aliphatic_ring_acceptor.qry b/data/reduced_graph/aliphatic_ring_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_acceptor.qry rename to data/reduced_graph/aliphatic_ring_acceptor.qry diff --git a/contrib/data/reduced_graph/aliphatic_ring_acceptor.txt b/data/reduced_graph/aliphatic_ring_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_acceptor.txt rename to data/reduced_graph/aliphatic_ring_acceptor.txt diff --git a/contrib/data/reduced_graph/aliphatic_ring_donor.qry b/data/reduced_graph/aliphatic_ring_donor.qry similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_donor.qry rename to data/reduced_graph/aliphatic_ring_donor.qry diff --git a/contrib/data/reduced_graph/aliphatic_ring_donor.txt b/data/reduced_graph/aliphatic_ring_donor.txt similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_donor.txt rename to data/reduced_graph/aliphatic_ring_donor.txt diff --git a/contrib/data/reduced_graph/aliphatic_ring_donor_acceptor.qry b/data/reduced_graph/aliphatic_ring_donor_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_donor_acceptor.qry rename to data/reduced_graph/aliphatic_ring_donor_acceptor.qry diff --git a/contrib/data/reduced_graph/aliphatic_ring_donor_acceptor.txt b/data/reduced_graph/aliphatic_ring_donor_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_donor_acceptor.txt rename to data/reduced_graph/aliphatic_ring_donor_acceptor.txt diff --git a/contrib/data/reduced_graph/aliphatic_ring_negative.qry b/data/reduced_graph/aliphatic_ring_negative.qry similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_negative.qry rename to data/reduced_graph/aliphatic_ring_negative.qry diff --git a/contrib/data/reduced_graph/aliphatic_ring_negative.txt b/data/reduced_graph/aliphatic_ring_negative.txt similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_negative.txt rename to data/reduced_graph/aliphatic_ring_negative.txt diff --git a/contrib/data/reduced_graph/aliphatic_ring_non_feature.qry b/data/reduced_graph/aliphatic_ring_non_feature.qry similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_non_feature.qry rename to data/reduced_graph/aliphatic_ring_non_feature.qry diff --git a/contrib/data/reduced_graph/aliphatic_ring_non_feature.txt b/data/reduced_graph/aliphatic_ring_non_feature.txt similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_non_feature.txt rename to data/reduced_graph/aliphatic_ring_non_feature.txt diff --git a/contrib/data/reduced_graph/aliphatic_ring_positive.qry b/data/reduced_graph/aliphatic_ring_positive.qry similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_positive.qry rename to data/reduced_graph/aliphatic_ring_positive.qry diff --git a/contrib/data/reduced_graph/aliphatic_ring_positive.txt b/data/reduced_graph/aliphatic_ring_positive.txt similarity index 100% rename from contrib/data/reduced_graph/aliphatic_ring_positive.txt rename to data/reduced_graph/aliphatic_ring_positive.txt diff --git a/contrib/data/reduced_graph/aromatic_ring_acceptor.qry b/data/reduced_graph/aromatic_ring_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_acceptor.qry rename to data/reduced_graph/aromatic_ring_acceptor.qry diff --git a/contrib/data/reduced_graph/aromatic_ring_acceptor.txt b/data/reduced_graph/aromatic_ring_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_acceptor.txt rename to data/reduced_graph/aromatic_ring_acceptor.txt diff --git a/contrib/data/reduced_graph/aromatic_ring_donor.qry b/data/reduced_graph/aromatic_ring_donor.qry similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_donor.qry rename to data/reduced_graph/aromatic_ring_donor.qry diff --git a/contrib/data/reduced_graph/aromatic_ring_donor.txt b/data/reduced_graph/aromatic_ring_donor.txt similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_donor.txt rename to data/reduced_graph/aromatic_ring_donor.txt diff --git a/contrib/data/reduced_graph/aromatic_ring_donor_acceptor.qry b/data/reduced_graph/aromatic_ring_donor_acceptor.qry similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_donor_acceptor.qry rename to data/reduced_graph/aromatic_ring_donor_acceptor.qry diff --git a/contrib/data/reduced_graph/aromatic_ring_donor_acceptor.txt b/data/reduced_graph/aromatic_ring_donor_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_donor_acceptor.txt rename to data/reduced_graph/aromatic_ring_donor_acceptor.txt diff --git a/contrib/data/reduced_graph/aromatic_ring_negative.qry b/data/reduced_graph/aromatic_ring_negative.qry similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_negative.qry rename to data/reduced_graph/aromatic_ring_negative.qry diff --git a/contrib/data/reduced_graph/aromatic_ring_negative.txt b/data/reduced_graph/aromatic_ring_negative.txt similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_negative.txt rename to data/reduced_graph/aromatic_ring_negative.txt diff --git a/contrib/data/reduced_graph/aromatic_ring_non_feature.qry b/data/reduced_graph/aromatic_ring_non_feature.qry similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_non_feature.qry rename to data/reduced_graph/aromatic_ring_non_feature.qry diff --git a/contrib/data/reduced_graph/aromatic_ring_non_feature.txt b/data/reduced_graph/aromatic_ring_non_feature.txt similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_non_feature.txt rename to data/reduced_graph/aromatic_ring_non_feature.txt diff --git a/contrib/data/reduced_graph/aromatic_ring_positive.qry b/data/reduced_graph/aromatic_ring_positive.qry similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_positive.qry rename to data/reduced_graph/aromatic_ring_positive.qry diff --git a/contrib/data/reduced_graph/aromatic_ring_positive.txt b/data/reduced_graph/aromatic_ring_positive.txt similarity index 100% rename from contrib/data/reduced_graph/aromatic_ring_positive.txt rename to data/reduced_graph/aromatic_ring_positive.txt diff --git a/contrib/data/reduced_graph/feature_node_acceptor.txt b/data/reduced_graph/feature_node_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph/feature_node_acceptor.txt rename to data/reduced_graph/feature_node_acceptor.txt diff --git a/contrib/data/reduced_graph/feature_node_acceptor1.qry b/data/reduced_graph/feature_node_acceptor1.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_acceptor1.qry rename to data/reduced_graph/feature_node_acceptor1.qry diff --git a/contrib/data/reduced_graph/feature_node_acceptor2.qry b/data/reduced_graph/feature_node_acceptor2.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_acceptor2.qry rename to data/reduced_graph/feature_node_acceptor2.qry diff --git a/contrib/data/reduced_graph/feature_node_acceptor_nitro.qry b/data/reduced_graph/feature_node_acceptor_nitro.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_acceptor_nitro.qry rename to data/reduced_graph/feature_node_acceptor_nitro.qry diff --git a/contrib/data/reduced_graph/feature_node_acid.qry b/data/reduced_graph/feature_node_acid.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_acid.qry rename to data/reduced_graph/feature_node_acid.qry diff --git a/contrib/data/reduced_graph/feature_node_donor.txt b/data/reduced_graph/feature_node_donor.txt similarity index 100% rename from contrib/data/reduced_graph/feature_node_donor.txt rename to data/reduced_graph/feature_node_donor.txt diff --git a/contrib/data/reduced_graph/feature_node_donor1.qry b/data/reduced_graph/feature_node_donor1.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_donor1.qry rename to data/reduced_graph/feature_node_donor1.qry diff --git a/contrib/data/reduced_graph/feature_node_donor2.qry b/data/reduced_graph/feature_node_donor2.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_donor2.qry rename to data/reduced_graph/feature_node_donor2.qry diff --git a/contrib/data/reduced_graph/feature_node_donor_acceptor.txt b/data/reduced_graph/feature_node_donor_acceptor.txt similarity index 100% rename from contrib/data/reduced_graph/feature_node_donor_acceptor.txt rename to data/reduced_graph/feature_node_donor_acceptor.txt diff --git a/contrib/data/reduced_graph/feature_node_donor_acceptor1.qry b/data/reduced_graph/feature_node_donor_acceptor1.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_donor_acceptor1.qry rename to data/reduced_graph/feature_node_donor_acceptor1.qry diff --git a/contrib/data/reduced_graph/feature_node_donor_acceptor2.qry b/data/reduced_graph/feature_node_donor_acceptor2.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_donor_acceptor2.qry rename to data/reduced_graph/feature_node_donor_acceptor2.qry diff --git a/contrib/data/reduced_graph/feature_node_negative.qry b/data/reduced_graph/feature_node_negative.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_negative.qry rename to data/reduced_graph/feature_node_negative.qry diff --git a/contrib/data/reduced_graph/feature_node_negative.txt b/data/reduced_graph/feature_node_negative.txt similarity index 100% rename from contrib/data/reduced_graph/feature_node_negative.txt rename to data/reduced_graph/feature_node_negative.txt diff --git a/contrib/data/reduced_graph/feature_node_positive.qry b/data/reduced_graph/feature_node_positive.qry similarity index 100% rename from contrib/data/reduced_graph/feature_node_positive.qry rename to data/reduced_graph/feature_node_positive.qry diff --git a/contrib/data/reduced_graph/feature_node_positive.txt b/data/reduced_graph/feature_node_positive.txt similarity index 100% rename from contrib/data/reduced_graph/feature_node_positive.txt rename to data/reduced_graph/feature_node_positive.txt diff --git a/contrib/data/reduced_graph/link_node.qry b/data/reduced_graph/link_node.qry similarity index 100% rename from contrib/data/reduced_graph/link_node.qry rename to data/reduced_graph/link_node.qry diff --git a/contrib/data/reduced_graph/link_node.txt b/data/reduced_graph/link_node.txt similarity index 100% rename from contrib/data/reduced_graph/link_node.txt rename to data/reduced_graph/link_node.txt diff --git a/contrib/data/reduced_graph/phenyl.qry b/data/reduced_graph/phenyl.qry similarity index 100% rename from contrib/data/reduced_graph/phenyl.qry rename to data/reduced_graph/phenyl.qry diff --git a/contrib/data/reduced_graph/queries b/data/reduced_graph/queries similarity index 100% rename from contrib/data/reduced_graph/queries rename to data/reduced_graph/queries diff --git a/contrib/data/reduced_graph/reductions b/data/reduced_graph/reductions similarity index 100% rename from contrib/data/reduced_graph/reductions rename to data/reduced_graph/reductions diff --git a/contrib/data/ring_replacement/.rings_3notarom.smi b/data/ring_replacement/.rings_3notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom.smi rename to data/ring_replacement/.rings_3notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom3notarom.smi b/data/ring_replacement/.rings_3notarom3notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom3notarom.smi rename to data/ring_replacement/.rings_3notarom3notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom3notarom4notarom.smi b/data/ring_replacement/.rings_3notarom3notarom4notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom3notarom4notarom.smi rename to data/ring_replacement/.rings_3notarom3notarom4notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom3notarom5notarom.smi b/data/ring_replacement/.rings_3notarom3notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom3notarom5notarom.smi rename to data/ring_replacement/.rings_3notarom3notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom3notarom6notarom.smi b/data/ring_replacement/.rings_3notarom3notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom3notarom6notarom.smi rename to data/ring_replacement/.rings_3notarom3notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom3notarom7notarom.smi b/data/ring_replacement/.rings_3notarom3notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom3notarom7notarom.smi rename to data/ring_replacement/.rings_3notarom3notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom4notarom.smi b/data/ring_replacement/.rings_3notarom4notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom4notarom.smi rename to data/ring_replacement/.rings_3notarom4notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom4notarom5notarom.smi b/data/ring_replacement/.rings_3notarom4notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom4notarom5notarom.smi rename to data/ring_replacement/.rings_3notarom4notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom4notarom6isarom.smi b/data/ring_replacement/.rings_3notarom4notarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom4notarom6isarom.smi rename to data/ring_replacement/.rings_3notarom4notarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom4notarom6notarom.smi b/data/ring_replacement/.rings_3notarom4notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom4notarom6notarom.smi rename to data/ring_replacement/.rings_3notarom4notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom5isarom.smi b/data/ring_replacement/.rings_3notarom5isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom5isarom.smi rename to data/ring_replacement/.rings_3notarom5isarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom5isarom5notarom.smi b/data/ring_replacement/.rings_3notarom5isarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom5isarom5notarom.smi rename to data/ring_replacement/.rings_3notarom5isarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom5isarom6notarom.smi b/data/ring_replacement/.rings_3notarom5isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom5isarom6notarom.smi rename to data/ring_replacement/.rings_3notarom5isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom5notarom.smi b/data/ring_replacement/.rings_3notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom5notarom.smi rename to data/ring_replacement/.rings_3notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom5notarom5notarom.smi b/data/ring_replacement/.rings_3notarom5notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom5notarom5notarom.smi rename to data/ring_replacement/.rings_3notarom5notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom5notarom6isarom.smi b/data/ring_replacement/.rings_3notarom5notarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom5notarom6isarom.smi rename to data/ring_replacement/.rings_3notarom5notarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom5notarom6notarom.smi b/data/ring_replacement/.rings_3notarom5notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom5notarom6notarom.smi rename to data/ring_replacement/.rings_3notarom5notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom5notarom7notarom.smi b/data/ring_replacement/.rings_3notarom5notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom5notarom7notarom.smi rename to data/ring_replacement/.rings_3notarom5notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom6isarom.smi b/data/ring_replacement/.rings_3notarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom6isarom.smi rename to data/ring_replacement/.rings_3notarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom6isarom6notarom.smi b/data/ring_replacement/.rings_3notarom6isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom6isarom6notarom.smi rename to data/ring_replacement/.rings_3notarom6isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom6isarom7notarom.smi b/data/ring_replacement/.rings_3notarom6isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom6isarom7notarom.smi rename to data/ring_replacement/.rings_3notarom6isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom6notarom.smi b/data/ring_replacement/.rings_3notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom6notarom.smi rename to data/ring_replacement/.rings_3notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom6notarom6notarom.smi b/data/ring_replacement/.rings_3notarom6notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom6notarom6notarom.smi rename to data/ring_replacement/.rings_3notarom6notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom6notarom7notarom.smi b/data/ring_replacement/.rings_3notarom6notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom6notarom7notarom.smi rename to data/ring_replacement/.rings_3notarom6notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_3notarom7notarom.smi b/data/ring_replacement/.rings_3notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_3notarom7notarom.smi rename to data/ring_replacement/.rings_3notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4isarom.smi b/data/ring_replacement/.rings_4isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4isarom.smi rename to data/ring_replacement/.rings_4isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4isarom5isarom.smi b/data/ring_replacement/.rings_4isarom5isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4isarom5isarom.smi rename to data/ring_replacement/.rings_4isarom5isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4isarom5isarom6isarom.smi b/data/ring_replacement/.rings_4isarom5isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4isarom5isarom6isarom.smi rename to data/ring_replacement/.rings_4isarom5isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4isarom5notarom7notarom.smi b/data/ring_replacement/.rings_4isarom5notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4isarom5notarom7notarom.smi rename to data/ring_replacement/.rings_4isarom5notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4isarom6isarom.smi b/data/ring_replacement/.rings_4isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4isarom6isarom.smi rename to data/ring_replacement/.rings_4isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4isarom6isarom6isarom.smi b/data/ring_replacement/.rings_4isarom6isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4isarom6isarom6isarom.smi rename to data/ring_replacement/.rings_4isarom6isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4isarom7isarom.smi b/data/ring_replacement/.rings_4isarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4isarom7isarom.smi rename to data/ring_replacement/.rings_4isarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4isarom7notarom.smi b/data/ring_replacement/.rings_4isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4isarom7notarom.smi rename to data/ring_replacement/.rings_4isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom.smi b/data/ring_replacement/.rings_4notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom.smi rename to data/ring_replacement/.rings_4notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom4notarom.smi b/data/ring_replacement/.rings_4notarom4notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom4notarom.smi rename to data/ring_replacement/.rings_4notarom4notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom4notarom4notarom.smi b/data/ring_replacement/.rings_4notarom4notarom4notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom4notarom4notarom.smi rename to data/ring_replacement/.rings_4notarom4notarom4notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom4notarom5notarom.smi b/data/ring_replacement/.rings_4notarom4notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom4notarom5notarom.smi rename to data/ring_replacement/.rings_4notarom4notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom4notarom6notarom.smi b/data/ring_replacement/.rings_4notarom4notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom4notarom6notarom.smi rename to data/ring_replacement/.rings_4notarom4notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5isarom.smi b/data/ring_replacement/.rings_4notarom5isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5isarom.smi rename to data/ring_replacement/.rings_4notarom5isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5isarom5notarom.smi b/data/ring_replacement/.rings_4notarom5isarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5isarom5notarom.smi rename to data/ring_replacement/.rings_4notarom5isarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5isarom6isarom.smi b/data/ring_replacement/.rings_4notarom5isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5isarom6isarom.smi rename to data/ring_replacement/.rings_4notarom5isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5isarom6notarom.smi b/data/ring_replacement/.rings_4notarom5isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5isarom6notarom.smi rename to data/ring_replacement/.rings_4notarom5isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5isarom7notarom.smi b/data/ring_replacement/.rings_4notarom5isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5isarom7notarom.smi rename to data/ring_replacement/.rings_4notarom5isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5notarom.smi b/data/ring_replacement/.rings_4notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5notarom.smi rename to data/ring_replacement/.rings_4notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5notarom5notarom.smi b/data/ring_replacement/.rings_4notarom5notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5notarom5notarom.smi rename to data/ring_replacement/.rings_4notarom5notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5notarom6isarom.smi b/data/ring_replacement/.rings_4notarom5notarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5notarom6isarom.smi rename to data/ring_replacement/.rings_4notarom5notarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5notarom6notarom.smi b/data/ring_replacement/.rings_4notarom5notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5notarom6notarom.smi rename to data/ring_replacement/.rings_4notarom5notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom5notarom7notarom.smi b/data/ring_replacement/.rings_4notarom5notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom5notarom7notarom.smi rename to data/ring_replacement/.rings_4notarom5notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom6isarom.smi b/data/ring_replacement/.rings_4notarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom6isarom.smi rename to data/ring_replacement/.rings_4notarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom6isarom6isarom.smi b/data/ring_replacement/.rings_4notarom6isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom6isarom6isarom.smi rename to data/ring_replacement/.rings_4notarom6isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom6isarom6notarom.smi b/data/ring_replacement/.rings_4notarom6isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom6isarom6notarom.smi rename to data/ring_replacement/.rings_4notarom6isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom6isarom7notarom.smi b/data/ring_replacement/.rings_4notarom6isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom6isarom7notarom.smi rename to data/ring_replacement/.rings_4notarom6isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom6notarom.smi b/data/ring_replacement/.rings_4notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom6notarom.smi rename to data/ring_replacement/.rings_4notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom6notarom6notarom.smi b/data/ring_replacement/.rings_4notarom6notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom6notarom6notarom.smi rename to data/ring_replacement/.rings_4notarom6notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom6notarom7notarom.smi b/data/ring_replacement/.rings_4notarom6notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom6notarom7notarom.smi rename to data/ring_replacement/.rings_4notarom6notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom7notarom.smi b/data/ring_replacement/.rings_4notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom7notarom.smi rename to data/ring_replacement/.rings_4notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_4notarom7notarom7notarom.smi b/data/ring_replacement/.rings_4notarom7notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_4notarom7notarom7notarom.smi rename to data/ring_replacement/.rings_4notarom7notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom.smi b/data/ring_replacement/.rings_5isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom.smi rename to data/ring_replacement/.rings_5isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5isarom.smi b/data/ring_replacement/.rings_5isarom5isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5isarom.smi rename to data/ring_replacement/.rings_5isarom5isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5isarom5isarom.smi b/data/ring_replacement/.rings_5isarom5isarom5isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5isarom5isarom.smi rename to data/ring_replacement/.rings_5isarom5isarom5isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5isarom5notarom.smi b/data/ring_replacement/.rings_5isarom5isarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5isarom5notarom.smi rename to data/ring_replacement/.rings_5isarom5isarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5isarom6isarom.smi b/data/ring_replacement/.rings_5isarom5isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5isarom6isarom.smi rename to data/ring_replacement/.rings_5isarom5isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5isarom6notarom.smi b/data/ring_replacement/.rings_5isarom5isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5isarom6notarom.smi rename to data/ring_replacement/.rings_5isarom5isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5isarom7isarom.smi b/data/ring_replacement/.rings_5isarom5isarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5isarom7isarom.smi rename to data/ring_replacement/.rings_5isarom5isarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5isarom7notarom.smi b/data/ring_replacement/.rings_5isarom5isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5isarom7notarom.smi rename to data/ring_replacement/.rings_5isarom5isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5notarom.smi b/data/ring_replacement/.rings_5isarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5notarom.smi rename to data/ring_replacement/.rings_5isarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5notarom5notarom.smi b/data/ring_replacement/.rings_5isarom5notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5notarom5notarom.smi rename to data/ring_replacement/.rings_5isarom5notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5notarom6isarom.smi b/data/ring_replacement/.rings_5isarom5notarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5notarom6isarom.smi rename to data/ring_replacement/.rings_5isarom5notarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5notarom6notarom.smi b/data/ring_replacement/.rings_5isarom5notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5notarom6notarom.smi rename to data/ring_replacement/.rings_5isarom5notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5notarom7isarom.smi b/data/ring_replacement/.rings_5isarom5notarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5notarom7isarom.smi rename to data/ring_replacement/.rings_5isarom5notarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom5notarom7notarom.smi b/data/ring_replacement/.rings_5isarom5notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom5notarom7notarom.smi rename to data/ring_replacement/.rings_5isarom5notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6isarom.smi b/data/ring_replacement/.rings_5isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6isarom.smi rename to data/ring_replacement/.rings_5isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6isarom6isarom.smi b/data/ring_replacement/.rings_5isarom6isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6isarom6isarom.smi rename to data/ring_replacement/.rings_5isarom6isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6isarom6notarom.smi b/data/ring_replacement/.rings_5isarom6isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6isarom6notarom.smi rename to data/ring_replacement/.rings_5isarom6isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6isarom7isarom.smi b/data/ring_replacement/.rings_5isarom6isarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6isarom7isarom.smi rename to data/ring_replacement/.rings_5isarom6isarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6isarom7notarom.smi b/data/ring_replacement/.rings_5isarom6isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6isarom7notarom.smi rename to data/ring_replacement/.rings_5isarom6isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6notarom.smi b/data/ring_replacement/.rings_5isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6notarom.smi rename to data/ring_replacement/.rings_5isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6notarom6notarom.smi b/data/ring_replacement/.rings_5isarom6notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6notarom6notarom.smi rename to data/ring_replacement/.rings_5isarom6notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6notarom7isarom.smi b/data/ring_replacement/.rings_5isarom6notarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6notarom7isarom.smi rename to data/ring_replacement/.rings_5isarom6notarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom6notarom7notarom.smi b/data/ring_replacement/.rings_5isarom6notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom6notarom7notarom.smi rename to data/ring_replacement/.rings_5isarom6notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom7isarom.smi b/data/ring_replacement/.rings_5isarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom7isarom.smi rename to data/ring_replacement/.rings_5isarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom7notarom.smi b/data/ring_replacement/.rings_5isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom7notarom.smi rename to data/ring_replacement/.rings_5isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5isarom7notarom7notarom.smi b/data/ring_replacement/.rings_5isarom7notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5isarom7notarom7notarom.smi rename to data/ring_replacement/.rings_5isarom7notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom.smi b/data/ring_replacement/.rings_5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom.smi rename to data/ring_replacement/.rings_5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom5notarom.smi b/data/ring_replacement/.rings_5notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom5notarom.smi rename to data/ring_replacement/.rings_5notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom5notarom5notarom.smi b/data/ring_replacement/.rings_5notarom5notarom5notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom5notarom5notarom.smi rename to data/ring_replacement/.rings_5notarom5notarom5notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom5notarom6isarom.smi b/data/ring_replacement/.rings_5notarom5notarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom5notarom6isarom.smi rename to data/ring_replacement/.rings_5notarom5notarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom5notarom6notarom.smi b/data/ring_replacement/.rings_5notarom5notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom5notarom6notarom.smi rename to data/ring_replacement/.rings_5notarom5notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom5notarom7isarom.smi b/data/ring_replacement/.rings_5notarom5notarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom5notarom7isarom.smi rename to data/ring_replacement/.rings_5notarom5notarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom5notarom7notarom.smi b/data/ring_replacement/.rings_5notarom5notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom5notarom7notarom.smi rename to data/ring_replacement/.rings_5notarom5notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom6isarom.smi b/data/ring_replacement/.rings_5notarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom6isarom.smi rename to data/ring_replacement/.rings_5notarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom6isarom6isarom.smi b/data/ring_replacement/.rings_5notarom6isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom6isarom6isarom.smi rename to data/ring_replacement/.rings_5notarom6isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom6isarom6notarom.smi b/data/ring_replacement/.rings_5notarom6isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom6isarom6notarom.smi rename to data/ring_replacement/.rings_5notarom6isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom6isarom7notarom.smi b/data/ring_replacement/.rings_5notarom6isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom6isarom7notarom.smi rename to data/ring_replacement/.rings_5notarom6isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom6notarom.smi b/data/ring_replacement/.rings_5notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom6notarom.smi rename to data/ring_replacement/.rings_5notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom6notarom6notarom.smi b/data/ring_replacement/.rings_5notarom6notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom6notarom6notarom.smi rename to data/ring_replacement/.rings_5notarom6notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom6notarom7isarom.smi b/data/ring_replacement/.rings_5notarom6notarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom6notarom7isarom.smi rename to data/ring_replacement/.rings_5notarom6notarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom6notarom7notarom.smi b/data/ring_replacement/.rings_5notarom6notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom6notarom7notarom.smi rename to data/ring_replacement/.rings_5notarom6notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom7isarom.smi b/data/ring_replacement/.rings_5notarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom7isarom.smi rename to data/ring_replacement/.rings_5notarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom7notarom.smi b/data/ring_replacement/.rings_5notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom7notarom.smi rename to data/ring_replacement/.rings_5notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_5notarom7notarom7notarom.smi b/data/ring_replacement/.rings_5notarom7notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_5notarom7notarom7notarom.smi rename to data/ring_replacement/.rings_5notarom7notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom.smi b/data/ring_replacement/.rings_6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom.smi rename to data/ring_replacement/.rings_6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6isarom.smi b/data/ring_replacement/.rings_6isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6isarom.smi rename to data/ring_replacement/.rings_6isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6isarom6isarom.smi b/data/ring_replacement/.rings_6isarom6isarom6isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6isarom6isarom.smi rename to data/ring_replacement/.rings_6isarom6isarom6isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6isarom6notarom.smi b/data/ring_replacement/.rings_6isarom6isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6isarom6notarom.smi rename to data/ring_replacement/.rings_6isarom6isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6isarom7isarom.smi b/data/ring_replacement/.rings_6isarom6isarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6isarom7isarom.smi rename to data/ring_replacement/.rings_6isarom6isarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6isarom7notarom.smi b/data/ring_replacement/.rings_6isarom6isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6isarom7notarom.smi rename to data/ring_replacement/.rings_6isarom6isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6notarom.smi b/data/ring_replacement/.rings_6isarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6notarom.smi rename to data/ring_replacement/.rings_6isarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6notarom6notarom.smi b/data/ring_replacement/.rings_6isarom6notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6notarom6notarom.smi rename to data/ring_replacement/.rings_6isarom6notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6notarom7isarom.smi b/data/ring_replacement/.rings_6isarom6notarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6notarom7isarom.smi rename to data/ring_replacement/.rings_6isarom6notarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom6notarom7notarom.smi b/data/ring_replacement/.rings_6isarom6notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom6notarom7notarom.smi rename to data/ring_replacement/.rings_6isarom6notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom7isarom.smi b/data/ring_replacement/.rings_6isarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom7isarom.smi rename to data/ring_replacement/.rings_6isarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom7isarom7notarom.smi b/data/ring_replacement/.rings_6isarom7isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom7isarom7notarom.smi rename to data/ring_replacement/.rings_6isarom7isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom7notarom.smi b/data/ring_replacement/.rings_6isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom7notarom.smi rename to data/ring_replacement/.rings_6isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6isarom7notarom7notarom.smi b/data/ring_replacement/.rings_6isarom7notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6isarom7notarom7notarom.smi rename to data/ring_replacement/.rings_6isarom7notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom.smi b/data/ring_replacement/.rings_6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom.smi rename to data/ring_replacement/.rings_6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom6notarom.smi b/data/ring_replacement/.rings_6notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom6notarom.smi rename to data/ring_replacement/.rings_6notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom6notarom6notarom.smi b/data/ring_replacement/.rings_6notarom6notarom6notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom6notarom6notarom.smi rename to data/ring_replacement/.rings_6notarom6notarom6notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom6notarom7isarom.smi b/data/ring_replacement/.rings_6notarom6notarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom6notarom7isarom.smi rename to data/ring_replacement/.rings_6notarom6notarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom6notarom7notarom.smi b/data/ring_replacement/.rings_6notarom6notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom6notarom7notarom.smi rename to data/ring_replacement/.rings_6notarom6notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom7isarom.smi b/data/ring_replacement/.rings_6notarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom7isarom.smi rename to data/ring_replacement/.rings_6notarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom7isarom7isarom.smi b/data/ring_replacement/.rings_6notarom7isarom7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom7isarom7isarom.smi rename to data/ring_replacement/.rings_6notarom7isarom7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom7isarom7notarom.smi b/data/ring_replacement/.rings_6notarom7isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom7isarom7notarom.smi rename to data/ring_replacement/.rings_6notarom7isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom7notarom.smi b/data/ring_replacement/.rings_6notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom7notarom.smi rename to data/ring_replacement/.rings_6notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_6notarom7notarom7notarom.smi b/data/ring_replacement/.rings_6notarom7notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_6notarom7notarom7notarom.smi rename to data/ring_replacement/.rings_6notarom7notarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_7isarom.smi b/data/ring_replacement/.rings_7isarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_7isarom.smi rename to data/ring_replacement/.rings_7isarom.smi diff --git a/contrib/data/ring_replacement/.rings_7isarom7notarom.smi b/data/ring_replacement/.rings_7isarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_7isarom7notarom.smi rename to data/ring_replacement/.rings_7isarom7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_7notarom.smi b/data/ring_replacement/.rings_7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_7notarom.smi rename to data/ring_replacement/.rings_7notarom.smi diff --git a/contrib/data/ring_replacement/.rings_7notarom7notarom.smi b/data/ring_replacement/.rings_7notarom7notarom.smi similarity index 100% rename from contrib/data/ring_replacement/.rings_7notarom7notarom.smi rename to data/ring_replacement/.rings_7notarom7notarom.smi diff --git a/contrib/data/ring_replacement/README.md b/data/ring_replacement/README.md similarity index 100% rename from contrib/data/ring_replacement/README.md rename to data/ring_replacement/README.md diff --git a/contrib/data/ring_replacement/aggregate_rings.rb b/data/ring_replacement/aggregate_rings.rb similarity index 100% rename from contrib/data/ring_replacement/aggregate_rings.rb rename to data/ring_replacement/aggregate_rings.rb diff --git a/contrib/data/ring_replacement/to_hidden.sh b/data/ring_replacement/to_hidden.sh similarity index 100% rename from contrib/data/ring_replacement/to_hidden.sh rename to data/ring_replacement/to_hidden.sh diff --git a/contrib/data/ring_replacement/to_linux.sh b/data/ring_replacement/to_linux.sh similarity index 100% rename from contrib/data/ring_replacement/to_linux.sh rename to data/ring_replacement/to_linux.sh diff --git a/contrib/data/ring_replacement/to_mac.sh b/data/ring_replacement/to_mac.sh similarity index 100% rename from contrib/data/ring_replacement/to_mac.sh rename to data/ring_replacement/to_mac.sh diff --git a/contrib/data/smiles_mutation_library b/data/smiles_mutation_library similarity index 100% rename from contrib/data/smiles_mutation_library rename to data/smiles_mutation_library diff --git a/data/zof/between_rings.qry b/data/zof/between_rings.qry new file mode 100644 index 00000000..97e4e344 --- /dev/null +++ b/data/zof/between_rings.qry @@ -0,0 +1,6 @@ +(0 Query + (A I version 2) + (0 ring_system_specifier + (A I min_distance_to_another_ring 4) + ) +) diff --git a/data/zof/coumarin.qry b/data/zof/coumarin.qry new file mode 100644 index 00000000..4ee89a3a --- /dev/null +++ b/data/zof/coumarin.qry @@ -0,0 +1,71 @@ +(0 Query + (A I min_nrings 2) + (A I Version 2) + (A I min_fused_ring_system_size 2) + (A D numeric_value 50) + (A C Comment "coumarin") + (0 Ring_System_Specifier + (A I min_nrings 2) + (A I min_aromatic_ring_count 2) + (A I min_heteroatoms 1) + ) + (0 Query_Atom + (A I atomic_number (7 8)) + (A I ncon 1) + (A I nbonds 2) + ) + (1 Query_Atom + (A I atomic_number 6) + (A I ncon 3) + (A I aromatic 1) + (A I attached_heteroatom_count 2) + (A I double_bond 0) + ) + (2 Query_Atom + (A I atomic_number 8) + (A I ncon 2) + (A I single_bond 1) + ) + (3 Query_Atom + (A I atomic_number 6) + (A I min_nrings 2) + (A I aromatic 1) + (A I single_bond 2) + ) + (4 Query_Atom + (A I atomic_number 6) + (A I aromatic 1) + (A I bond 3) + ) + (5 Query_Atom + (A I atomic_number 6) + (A I aromatic 1) + (A I bond 4) + ) + (6 Query_Atom + (A I atomic_number 6) + (A I aromatic 1) + (A I bond 5) + ) + (7 Query_Atom + (A I atomic_number 6) + (A I aromatic 1) + (A I bond 6) + ) + (8 Query_Atom + (A I atomic_number 6) + (A I aromatic 1) + (A I bond 7) + (A I bond 3) + ) + (9 Query_Atom + (A I atomic_number 6) + (A I aromatic 1) + (A I single_bond 8) + ) + (10 Query_Atom + (A I atomic_number 6) + (A I double_bond 9) + (A I single_bond 1) + ) +) diff --git a/data/zof/dimethyl_ring.qry b/data/zof/dimethyl_ring.qry new file mode 100644 index 00000000..23c116eb --- /dev/null +++ b/data/zof/dimethyl_ring.qry @@ -0,0 +1,8 @@ +(0 Query + (A I version 2) + (A C Comment "Multiple Methyl Substituents") + (0 Ring_System_Specifier + (A I min_ncon 3) + (A C environment ">1[D>2]-!@[C,F,Cl,I;D1]") + ) +) diff --git a/data/zof/disubstituted.qry b/data/zof/disubstituted.qry new file mode 100644 index 00000000..264f61d9 --- /dev/null +++ b/data/zof/disubstituted.qry @@ -0,0 +1,9 @@ +(0 Query + (A I version 2) + (A C Comment "disubstituted") + (0 Ring_Specifier + (A I aromatic 0) + (A I min_ring_size 4) + (A C environment "[CD4](-!@*)-!@*") + ) +) diff --git a/data/zof/ester.qry b/data/zof/ester.qry new file mode 100644 index 00000000..36d36c0f --- /dev/null +++ b/data/zof/ester.qry @@ -0,0 +1,14 @@ +# RuleClass +# SubClass ester + +# Fred Bruns Dec 2003 +(0 Query + (A C Comment "ester") + (A I Version 2) + (A D numeric_value 35) + (A C smarts "[OD1]=[CD3R0T2]-[OD2]") + (1 Environment_no_Match + (A I single_bond 2) + (A C smarts "c") + ) +) diff --git a/data/zof/floppy.qry b/data/zof/floppy.qry new file mode 100644 index 00000000..e0cf8c08 --- /dev/null +++ b/data/zof/floppy.qry @@ -0,0 +1,5 @@ +(0 Query + (A I version 2) + (A C Comment "Floppy") + (A C smarts "[CR0X4D>1]!@[CR0X4D>1]!@[CR0X4]") +) diff --git a/data/zof/multiple_anilines.qry b/data/zof/multiple_anilines.qry new file mode 100644 index 00000000..5cc3b78f --- /dev/null +++ b/data/zof/multiple_anilines.qry @@ -0,0 +1,8 @@ +(0 Query + (A C Comment "Multiple anilines") + (A I Version 2) + (0 Ring_Specifier + (A I aromatic 1) + (A C environment ">1a-[NH>0R0]") + ) +) diff --git a/data/zof/multiple_halogen_on_one_ring.qry b/data/zof/multiple_halogen_on_one_ring.qry new file mode 100644 index 00000000..35fa13bb --- /dev/null +++ b/data/zof/multiple_halogen_on_one_ring.qry @@ -0,0 +1,8 @@ +(0 Query + (A I Version 2) + (A C Comment "Multiple halogens on one ring") + (0 Ring_Specifier + (A I aromatic 1) + (A C environment ">1a-[F,Cl,Br,I]") + ) +) diff --git a/data/zof/multiple_large_ring_systems.qry b/data/zof/multiple_large_ring_systems.qry new file mode 100644 index 00000000..9896b615 --- /dev/null +++ b/data/zof/multiple_large_ring_systems.qry @@ -0,0 +1,8 @@ +(0 Query + (A C Comment "Multiple large ring systems") + (A I Version 2) + (0 Ring_Specifier + (A I min_ring_size 7) + (A I min_hits_needed 2) + ) +) diff --git a/data/zof/polyhalogenated_ring.qry b/data/zof/polyhalogenated_ring.qry new file mode 100644 index 00000000..5ceab54f --- /dev/null +++ b/data/zof/polyhalogenated_ring.qry @@ -0,0 +1,6 @@ +(0 Query + (A C comment "Polyhalogenated") + (0 Ring_Specifier + (A C environment ">1[R]-[F,Cl,Br,I]") + ) +) diff --git a/data/zof/pyrrole.qry b/data/zof/pyrrole.qry new file mode 100644 index 00000000..7ac1c5c0 --- /dev/null +++ b/data/zof/pyrrole.qry @@ -0,0 +1,13 @@ +(0 Query + (A C Comment "pyrrole") + (A D numeric_value 50) + (A I Version 2) + (0 Ring_Specifier + (A I aromatic 1) + (A I ring_size 5) + (A C environment "1[$([nH]),$([nD3T0]-[CG0])]") + (A I heteroatom_count 1) + (A I attached_heteroatom_count 0) + (A I fused 0) + ) +) diff --git a/data/zof/reverse_coumarin.qry b/data/zof/reverse_coumarin.qry new file mode 100644 index 00000000..1e9df308 --- /dev/null +++ b/data/zof/reverse_coumarin.qry @@ -0,0 +1,5 @@ +(0 Query + (A C Comment "Reversed Coumarin") + (A I Version 2) + (A C smarts "[OD1]=c1occc2c1cccc2") +) diff --git a/data/zof/ring_substitution.qry b/data/zof/ring_substitution.qry new file mode 100644 index 00000000..fd640242 --- /dev/null +++ b/data/zof/ring_substitution.qry @@ -0,0 +1,7 @@ +(0 Query + (A I version 2) + (0 Ring_System_Specifier + (A I min_ncon 3) + (A C environment ">2[D>2]-!@[R0]") + ) +) diff --git a/data/zof/strained_6arom4.qry b/data/zof/strained_6arom4.qry new file mode 100644 index 00000000..cc8a5f59 --- /dev/null +++ b/data/zof/strained_6arom4.qry @@ -0,0 +1,6 @@ +(0 Query + (A C Comment "Cyclobutyl fused to arom") + (A I version 2) + (A I min_nrings 2) + (A C smarts "[cD3R2]1:[cD3]-C-C1") +) diff --git a/data/zof/strongly_fused_ring.qry b/data/zof/strongly_fused_ring.qry new file mode 100644 index 00000000..9b20d593 --- /dev/null +++ b/data/zof/strongly_fused_ring.qry @@ -0,0 +1,4 @@ +(0 Query + (A I version 2) + (A I min_strongly_fused_ring_count 1) +) diff --git a/data/zof/too_much_ring_spinach.qry b/data/zof/too_much_ring_spinach.qry new file mode 100644 index 00000000..b632ad9d --- /dev/null +++ b/data/zof/too_much_ring_spinach.qry @@ -0,0 +1,7 @@ +(0 Query + (A I version 2) + (A C Comment "Ring Spinach") + (0 ring_system_specifier + (A I min_atoms_in_spinach_group 5) + ) +) diff --git a/docker-compose.yml b/docker-compose.yml index 4ede20c1..8e77ddb3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ lilly_mol: - image: lillymolprivate + image: lillymol container_name: lilly_mol volumes: - .:/test command: > - bash -c "tail -f /dev/null" \ No newline at end of file + bash -c "tail -f /dev/null" diff --git a/docs/Molecule_Lib/substructure.md b/docs/Molecule_Lib/substructure.md index fc0b4136..6f173bc3 100644 --- a/docs/Molecule_Lib/substructure.md +++ b/docs/Molecule_Lib/substructure.md @@ -448,6 +448,12 @@ Several tools assign numeric values to queries or atoms. This is a means of associating a numeric value with a particular matched atom. Only useful for low level programming. +If the number is a positive integer something like '[/IWNv23C]` will work +but if negative or floating point numbers are needed, then `[/IWNv{-3}C]` +is needed. Note that since the '.' character is special in smiles, if +you have a floating point number it must instead be entered with an +underscore `[/IWNv{-3_14}C]` which is interpreted as `[/IWNv{-3.14}C]`. + ## Future As use cases emerge further `/IW` directives may be added. Some can be evalated during atom matching, others are applied after an embedding has diff --git a/docs/Molecule_Tools/trxn.md b/docs/Molecule_Tools/trxn.md index ffbb9b7d..4a4449d6 100644 --- a/docs/Molecule_Tools/trxn.md +++ b/docs/Molecule_Tools/trxn.md @@ -471,6 +471,22 @@ valence of the atom is OK. Note that it might remove all the explicit hydrogen connections and still have a bad valence. +## -J coords +Like all LillyMol tools, trxn is 3-D capable. With this option in effect, +3-D smiles will be written if smiles output is requested. + +## -J minpfs=\ -J maxpfs=\ +Reactions can generate fragments that are too small (or too large). Sometimes +it is possible to construct the reaction queries so that undesirable +fragment sizes are not generated, but sometimes this is challenging. Instead, +these directives allow filtering of product molecules if they contain +fragments that violate these directives. + +. minpfs=\ If the product contains a fragment with fewer than \ atoms, +then discard the entire product molecule. +. maxpfs=\ If the product contains a fragment with more than \ atoms, +then discard the entire product molecule. + ## -L If there are multiple fragments generated by the reaction, only retain the largest. In the reaction specification, fragments can be removed, diff --git a/docs/python/LillyMolPython.md b/docs/python/LillyMolPython.md index 626d2383..42e8d0b8 100644 --- a/docs/python/LillyMolPython.md +++ b/docs/python/LillyMolPython.md @@ -28,10 +28,17 @@ between C++ and Python. Perhaps these could be lessened via careful inspection, but for now, there is no claim that this is as fast as things could be. ## Building -In order to build the shared libraries needed for python binding, the following -build command was used. +Your python environment *must* include pybind11. Normally ``` -bazelisk --output_user_root=/local/disk/ian build --enable_bzlmod --experimental_cc_shared_library --cxxopt=-DTODAY=\"$(date +%Y-%b-%d)\" --cxxopt=-DGIT_HASH=\"$(git rev-parse --short --verify HEAD)\" --local_cpu_resources=10 -c opt pybind:all +pip install pybond11 +``` +will accomplish this. + +Normally the python bindings are built as part of the default build, +the script [build_from_source.sh](/src/build_from_source.sh), but if +you wish to compile separately that can be done via +``` +bazelisk --output_user_root=/local/disk/ian build --cxxopt=-DTODAY=\"$(date +%Y-%b-%d)\" --cxxopt=-DGIT_HASH=\"$(git rev-parse --short --verify HEAD)\" --local_cpu_resources=10 -c opt pybind:all ``` This generates several `*.so` files in bazel-bin/python. In addition, LillyMol now has several run-time dependencies, and these also need to be made available. @@ -39,7 +46,10 @@ For now, the script `copy_shared_libraries.sh` in the `src` directory will copy the needed files out of bazel-bin and into lib64. See `WORKSPACE` for how we configured the local python and pybind11 installs. -This was quite difficult to get right. +This was quite difficult to get right. Normally these will be auto +configured for you by the [build_third_party](/src/build_third_party.sh) script, +which in turn calls [update_python_in_workspace](/src/update_python_in_workspace.py) +which interrogates the python installation. Once the shared libraries are copied to `LillyMol/lib64`, a script, `run_python.sh` in this directory can be used to invoke python with those libraries avaialble. @@ -88,7 +98,9 @@ objects for things like aromaticity and ring membership start with ``` mol.compute_aromaticity_if_needed() ``` -which will force computaion of aromaticity. +which will ensure that aromaticity information is propagated throughout +all parts of the molecule - and if that has already been done, this does +nothing. Atoms do not know if they are in a ring or not, nor whether they are aromatic, or what fragment they are in. Fragment membership, @@ -151,10 +163,9 @@ Note that in LillyMol a molecule with an invalid valence is a valid molecule. If you don't want molecules with valence errors, use the valence_ok() method to check each molecule and skip those having an invalid valence. -A more pythonic way of reading structures should be implemented. Maybe -something like +A more pythonic way of reading structures is available as ``` - with Reader('/path/to/file.smi', FileType.SMI) as reader: + with ReaderContext('/path/to/file.sdf') as reader: for mol in reader: for atom in mol: ... @@ -331,14 +342,14 @@ The most common methods for a Molecule currently implemented are | compute_Gasteiger_Huckel_partial_charges() | Gasteiger Huckel partial charges | | compute_Del_Re_partial_charges() | Del Re partial charges | | compute_Pullman_partial_charges() | Del Re partial charges | -| __eq__ | True if m1 == m2. Will use unique smiles if necessary | +| \__eq__ | True if m1 == m2. Will use unique smiles if necessary | | m1 += m2 | Adds atoms and bonds from m2 to m1 | | m1 + m2 | Returns a new molecule containing m1 and m2 | -| __iter__ | List of Atoms | -| __getitem__ | Get i'th atom | -| __len__ | Number of atoms | -| __eq__ | True if molecules contain same structures | -| __contains__ | True of molecule contains atomic number | +| \__iter__ | List of Atoms | +| \__getitem__ | Get i'th atom | +| \__len__ | Number of atoms | +| \__eq__ | True if molecules contain same structures | +| \__contains__ | True of molecule contains atomic number | | valence_ok() | True if all atoms have an OK valence | | ok | True if the internal state of the Molecule is ok | | debug_string() | String representation of internal state: print(m.debug_string())| @@ -374,9 +385,9 @@ The Atom object supports | fully_saturated() | True nbonds() == ncon() | | atom_map() | atom map number | | connections(atom) | iterable list of atoms attached | -| __iter__ | List of Bonds attached | -| __contains__ | True if atom is bonded to | -| __len__ | Number of connections | +| \__iter__ | List of Bonds attached | +| \__contains__ | True if atom is bonded to | +| \__len__ | Number of connections | In additon an Atom object inherits from an object that holds coordinates. A subsequent version will enable that functionality. @@ -440,7 +451,7 @@ And a couple of other things. | GetBeginAtomIdx() | Same as a1() | | GetEndAtomIdx() | Same as a2() | | GetBondType() | Same as btype() | -| __contains__ | involves() | +| \__contains__ | involves() | ## Set_of_Atoms Methods Set_of_Atoms objects are used extensively in LillyMol. Despite the name, @@ -453,10 +464,10 @@ Set_of_Atoms contained duplicate atom numbers. | empty() | True of the set is empty | | size() | Number of items | | scatter(list, value) | Set values to 'value' | -| __len__ | Number of items | -| __getitem__ | Access via [i] | -| __iter__ | Access atoms via iterators | -| __contains__ | Is atom included | +| \__len__ | Number of items | +| \__getitem__ | Access via [i] | +| \__iter__ | Access atoms via iterators | +| \__contains__ | Is atom included | The C++ version contains several gather and scatter type methods. Other methods may be added. @@ -484,8 +495,8 @@ trace out a bonded path through the ring. | strongly_fused_ring_neighbours() | Rings sharing more than 1 bond | | contains_bond(a1, a2) | True if Ring contains these atoms | | is_aromatic() | True if ring is aromatic | -| __contains__ | Is atom included | -| __len__ | Size | +| \__contains__ | Is atom included | +| \__len__ | Size | To count the number of isolated (not fused) 5 membered aromatic rings ``` diff --git a/src/.bazelrc b/src/.bazelrc index 931129a4..0535c654 100644 --- a/src/.bazelrc +++ b/src/.bazelrc @@ -1,9 +1,12 @@ +# This is probably what you want +# build --cxxopt=-std=c++20 --copt=-march=native --cxxopt=-march=native + # build --cxxopt=-std=c++20 --copt=-march=core-avx2 -# build --cxxopt=-std=c++20 --copt=-march=native # sandybridge 2011 build --cxxopt=-std=c++20 --cxxopt=-march=sandybridge --cxxopt=-mtune=sandybridge -# westmere 2010 -# build --cxxopt=-std=c++20 --cxxopt=-march=westmere --cxxopt=-mtune=westmere + +build --enable_bzlmod --experimental_cc_shared_library + build:asan --strip=never build:asan --copt -fsanitize=address build:asan --cxxopt -fsanitize=address @@ -33,6 +36,7 @@ build:msan --action_env=MSAN_OPTIONS=poison_in_dtor=1 #Taken from https://docs.bazel.build/versions/main/tutorial/cc-toolchain-config.html +# No longer works. TODO:ianwatson re-enable clang as a compiler. build:clang_config --crosstool_top=//toolchain:clang_suite # Use --cpu as a differentiator. diff --git a/src/Utilities/BerkeleyDB/BUILD b/src/BerkeleyDB/BUILD similarity index 89% rename from src/Utilities/BerkeleyDB/BUILD rename to src/BerkeleyDB/BUILD index 733b3b38..4cc755ea 100644 --- a/src/Utilities/BerkeleyDB/BUILD +++ b/src/BerkeleyDB/BUILD @@ -3,6 +3,7 @@ load("//build_deps:install.bzl", "local_install") local_install( name = "install", srcs = [ + ":enough_inventory_bdb", ":iwbdb_cat", ":iwbdb_compare", ":iwbdb_delete", @@ -15,6 +16,22 @@ local_install( ], ) +cc_binary( + name = "enough_inventory_bdb", + srcs = [ + "enough_inventory_bdb.cc", + ], + tags = ["berkeleydb"], + deps = [ + "//Foundational/accumulator:accumulator", + "//Foundational/cmdline:iwcmdline", + "//Foundational/data_source:iwstring_data_source", + "//Foundational/iwmisc:iwmisc", + "//Foundational/iw_tdt:iw_tdt", + "@berkeleydb", + ], +) + cc_binary( name = "iwbdb_cat", srcs = [ diff --git a/src/Utilities/General/enough_inventory_bdb.cc b/src/BerkeleyDB/enough_inventory_bdb.cc similarity index 100% rename from src/Utilities/General/enough_inventory_bdb.cc rename to src/BerkeleyDB/enough_inventory_bdb.cc diff --git a/src/Utilities/BerkeleyDB/iwbdb_cat.cc b/src/BerkeleyDB/iwbdb_cat.cc similarity index 100% rename from src/Utilities/BerkeleyDB/iwbdb_cat.cc rename to src/BerkeleyDB/iwbdb_cat.cc diff --git a/src/Utilities/BerkeleyDB/iwbdb_compare.cc b/src/BerkeleyDB/iwbdb_compare.cc similarity index 98% rename from src/Utilities/BerkeleyDB/iwbdb_compare.cc rename to src/BerkeleyDB/iwbdb_compare.cc index 97a84931..7c1584bd 100644 --- a/src/Utilities/BerkeleyDB/iwbdb_compare.cc +++ b/src/BerkeleyDB/iwbdb_compare.cc @@ -330,6 +330,8 @@ iwbdb_compare(int ndb, Db** db, IWString_and_File_Descriptor& output) { if (break_on_first_difference) { return 1; } + } else { + ++records_matching; } } @@ -499,7 +501,8 @@ iwbdb_compare(int argc, char** argv) { output.flush(); - cerr << "Read " << records_in_database << " database records\n"; + cerr << "Read " << records_in_database << " database records, " << + records_matching << " records matched across databases\n"; for (int i = 1; i < ndb; i++) { cerr << "Database '" << cl[i] << "' " << different_records[i] << " records differing\n"; diff --git a/src/Utilities/BerkeleyDB/iwbdb_delete.cc b/src/BerkeleyDB/iwbdb_delete.cc similarity index 100% rename from src/Utilities/BerkeleyDB/iwbdb_delete.cc rename to src/BerkeleyDB/iwbdb_delete.cc diff --git a/src/Utilities/BerkeleyDB/iwbdb_exists.cc b/src/BerkeleyDB/iwbdb_exists.cc similarity index 100% rename from src/Utilities/BerkeleyDB/iwbdb_exists.cc rename to src/BerkeleyDB/iwbdb_exists.cc diff --git a/src/Utilities/BerkeleyDB/iwbdb_fetch.cc b/src/BerkeleyDB/iwbdb_fetch.cc similarity index 100% rename from src/Utilities/BerkeleyDB/iwbdb_fetch.cc rename to src/BerkeleyDB/iwbdb_fetch.cc diff --git a/src/Utilities/BerkeleyDB/iwbdb_from_tdt.cc b/src/BerkeleyDB/iwbdb_from_tdt.cc similarity index 100% rename from src/Utilities/BerkeleyDB/iwbdb_from_tdt.cc rename to src/BerkeleyDB/iwbdb_from_tdt.cc diff --git a/src/Utilities/BerkeleyDB/iwbdb_list.cc b/src/BerkeleyDB/iwbdb_list.cc similarity index 100% rename from src/Utilities/BerkeleyDB/iwbdb_list.cc rename to src/BerkeleyDB/iwbdb_list.cc diff --git a/src/Utilities/BerkeleyDB/iwbdb_load.cc b/src/BerkeleyDB/iwbdb_load.cc similarity index 100% rename from src/Utilities/BerkeleyDB/iwbdb_load.cc rename to src/BerkeleyDB/iwbdb_load.cc diff --git a/src/Utilities/BerkeleyDB/iwbdb_merge_into_tdt.cc b/src/BerkeleyDB/iwbdb_merge_into_tdt.cc similarity index 100% rename from src/Utilities/BerkeleyDB/iwbdb_merge_into_tdt.cc rename to src/BerkeleyDB/iwbdb_merge_into_tdt.cc diff --git a/src/Utilities/BerkeleyDB/unpack_data.cc b/src/BerkeleyDB/unpack_data.cc similarity index 100% rename from src/Utilities/BerkeleyDB/unpack_data.cc rename to src/BerkeleyDB/unpack_data.cc diff --git a/src/Utilities/BerkeleyDB/unpack_data.h b/src/BerkeleyDB/unpack_data.h similarity index 100% rename from src/Utilities/BerkeleyDB/unpack_data.h rename to src/BerkeleyDB/unpack_data.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 90c766a1..c7be4eca 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,9 @@ cmake_minimum_required(VERSION 3.16.1) cmake_policy(SET CMP0077 NEW) -#cmake_minimum_required(VERSION 3.10.2) project(LillyMol) +# TODO:ianwatson get cmake working with this release +message(FATAL_ERROR "cmake infrastructure currently not functional") + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) diff --git a/src/Dockerfile b/src/Dockerfile deleted file mode 100644 index c46b0733..00000000 --- a/src/Dockerfile +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This Dockerfile provides a base image with the libraries needed to compile -# and test CLIF preinstalled. Example workflow using this image: -# -# // Build docker image -# docker build $CLIF_DIR --tag clif --build-arg=UBUNTU_VERSION=18.04 ... -# -# // Configure build -# docker run --volume $CLIF_DIR:/clif --workdir /clif/build clif cmake .. -# -# // Build clif-matcher -# docker run --volume $CLIF_DIR:/clif --workdir /clif/build clif make clif-matcher -# -# // Run cc tests -# docker run --volume $CLIF_DIR:/clif --workdir /clif/build clif ctest -# -# This docker image can be customized using the following build args: -# -# UBUNTU_VERSION: one of tags listed on https://hub.docker.com/_/ubuntu -# ABSL_VERSION: one of abseil/abseil-cpp Github releases -# PROTOBUF_VERSION: one of protocolbuffers/protobuf Github releases -# PYTHON_VERSION: python version to use (>= 3.6) - -ARG UBUNTU_VERSION=18.04 - -FROM ubuntu:${UBUNTU_VERSION} - -ARG ABSL_VERSION=20200923 -ARG PROTOBUF_VERSION=3.13.0 -ARG PYTHON_VERSION=3.7 - -ENV DEBIAN_FRONTEND=noninteractive - -RUN apt-get update && apt-get install -y --no-install-recommends \ - autoconf \ - automake \ - cmake \ - curl \ - gpg-agent \ - g++ \ - libtool \ - make \ - pkg-config \ - software-properties-common \ - wget \ - unzip - -# Configure LLVM 11 apt repository -RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \ - add-apt-repository "deb http://apt.llvm.org/$(lsb_release -sc)/ llvm-toolchain-$(lsb_release -sc)-11 main" - -# Install CLIF dependencies -RUN apt-get update && apt-get install -y \ - clang-11 \ - libclang-11-dev \ - libgoogle-glog-dev \ - libgtest-dev \ - libllvm11 \ - llvm-11-dev \ - python3-dev \ - python3-pyparsing \ - zlib1g-dev - -# Configure deadsnakes PPA with the more recent versions of python packaged for -# Ubuntu. See https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa -RUN add-apt-repository ppa:deadsnakes/ppa && \ - apt-get update && \ - apt-get install -y \ - "python$PYTHON_VERSION-dev" \ - "python$PYTHON_VERSION-distutils" - -# Install latest version of pip since the version on ubuntu could be outdated -RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \ - "python$PYTHON_VERSION" get-pip.py && \ - rm get-pip.py - -# Compile and install absl-cpp from source -RUN wget "https://github.com/abseil/abseil-cpp/archive/$ABSL_VERSION.tar.gz" && \ - tar -xf "$ABSL_VERSION.tar.gz" && \ - mkdir "abseil-cpp-$ABSL_VERSION/build" && \ - cd "abseil-cpp-$ABSL_VERSION/build" && \ - cmake .. -DCMAKE_POSITION_INDEPENDENT_CODE=true && \ - make install && \ - rm -rf "/abseil-cpp-$ABSL_VERSION" "/$ABSL_VERSION.tar.gz" - -# Compile and install protobuf from source -RUN wget "https://github.com/protocolbuffers/protobuf/releases/download/v$PROTOBUF_VERSION/protobuf-cpp-$PROTOBUF_VERSION.tar.gz" && \ - tar -xf "protobuf-cpp-$PROTOBUF_VERSION.tar.gz" && \ - cd "protobuf-$PROTOBUF_VERSION" && \ - # Configure and install C++ libraries - ./autogen.sh && \ - ./configure && \ - make -j$(nproc) && \ - make install && \ - ldconfig && \ - rm -rf "/protobuf-$PROTOBUF_VERSION" "/protobuf-cpp-$PROTOBUF_VERSION.tar.gz" - -# Install googletest -RUN cd /usr/src/gtest && \ - cmake . && \ - make install - -# Install python runtime and test dependencies -RUN "python$PYTHON_VERSION" -m pip install \ - absl-py \ - parameterized \ - protobuf=="$PROTOBUF_VERSION" - -# copy our own stuff here - -# Needs based on local project -RUN apt-get update && apt-get install -y \ - build-essential \ - f2c \ - libleveldb-dev \ - libre2-dev \ - libsnappy-dev - - -RUN mkdir -p /app/LillyMol -COPY . /app/LillyMol -WORKDIR /app/LillyMol/build -RUN IWTEST=OFF cmake -f ../CMakeLists.txt && cmake --build .. diff --git a/src/Foundational/iwaray/iwaray.h b/src/Foundational/iwaray/iwaray.h index 4b14cca1..b2c903cc 100644 --- a/src/Foundational/iwaray/iwaray.h +++ b/src/Foundational/iwaray/iwaray.h @@ -2070,6 +2070,8 @@ extending_resizable_array::extending_resizable_array(T ini) return; } +// Oct 2023. Extending the array seems like undesirable behaviour. +// TODO:ianwatson investigate and hopefully change. template T & extending_resizable_array::operator [](int i) diff --git a/src/Foundational/iwmisc/minmaxspc.h b/src/Foundational/iwmisc/minmaxspc.h index dfed8243..f4b24b9d 100644 --- a/src/Foundational/iwmisc/minmaxspc.h +++ b/src/Foundational/iwmisc/minmaxspc.h @@ -1,8 +1,10 @@ #ifndef FOUNDATIONAL_IWMISC_MINMAXSPC_H #define FOUNDATIONAL_IWMISC_MINMAXSPC_H -#include +#include +#include "Foundational/iwmisc/iwconfig.h" +#include "Foundational/iwaray/iwaray.h" #include "Foundational/iwstring/iwstring.h" #include "set_or_unset.h" #include "iwarchive.h" @@ -79,9 +81,6 @@ template std::ostream & #if (IW_IMPLEMENTATIONS_EXPOSED) || defined(MINMAXSPC_IMPLEMENTATION) #include -#include - -#include "minmaxspc.h" template Min_Max_Specifier::Min_Max_Specifier() diff --git a/src/Foundational/iwmisc/proto_support.h b/src/Foundational/iwmisc/proto_support.h index 33ca25d0..7486be63 100644 --- a/src/Foundational/iwmisc/proto_support.h +++ b/src/Foundational/iwmisc/proto_support.h @@ -164,6 +164,28 @@ ReadTextProto(IWString& fname) { return result; } +template +std::unique_ptr +ReadTextProtoPtr(IWString& fname) { + AFile input(fname, O_RDONLY); + if (! input.good()) { + cerr << "ReadTextProto:cannot open '" << fname << "'\n"; + return nullptr; + } + + using google::protobuf::io::ZeroCopyInputStream; + using google::protobuf::io::FileInputStream; + std::unique_ptr zero_copy_input(new FileInputStream(input.fd())); + + std::unique_ptr result = std::make_unique(); + if (! google::protobuf::TextFormat::Parse(zero_copy_input.get(), result.get())) { + cerr << "ReadTextProto:cannot read '" << fname << "'\n"; + return nullptr; + } + + return result; +} + // TextFormat does not allow comments. We can enable them. // Note that it is possible to imagine a failure where a text // value gets wrapped onto a separate line??? Probably not. diff --git a/src/Foundational/iwstring/IWString_class.cc b/src/Foundational/iwstring/IWString_class.cc index 526dbd2e..b568c977 100644 --- a/src/Foundational/iwstring/IWString_class.cc +++ b/src/Foundational/iwstring/IWString_class.cc @@ -5367,8 +5367,8 @@ const_IWSubstring::expand_environment_variables(IWString & destination) const return rc; } -constexpr char open_brace = '{'; -constexpr char close_brace = '}'; +static constexpr char kOpenBrace = '{'; +static constexpr char kCloseBrace = '}'; std::optional IWString::ExpandEnvironmentVariables() const { @@ -5392,7 +5392,7 @@ IWString::ExpandEnvironmentVariables() const { return result; } - if (_things[i + 1] != open_brace) { // $ without following braces, not expanded. + if (_things[i + 1] != kOpenBrace) { // $ without following braces, not expanded. result += '$'; continue; } @@ -5402,7 +5402,7 @@ IWString::ExpandEnvironmentVariables() const { int start_of_variable = i; int closing_brace = -1; for ( ; i < _number_elements; ++i) { - if (_things[i] == close_brace) { + if (_things[i] == kCloseBrace) { closing_brace = i; break; } diff --git a/src/Foundational/iwstring/iwstring.h b/src/Foundational/iwstring/iwstring.h index 968844fb..5d38c4d7 100644 --- a/src/Foundational/iwstring/iwstring.h +++ b/src/Foundational/iwstring/iwstring.h @@ -8,6 +8,7 @@ #endif #include +#include #include #include diff --git a/src/Foundational/iwstring/iwstring_test.cc b/src/Foundational/iwstring/iwstring_test.cc index fa601ad1..d267590a 100644 --- a/src/Foundational/iwstring/iwstring_test.cc +++ b/src/Foundational/iwstring/iwstring_test.cc @@ -77,11 +77,18 @@ TEST_P(TestExpandEnv, TestExpandEnv) { } std::optional expanded = params.input.ExpandEnvironmentVariables(); - EXPECT_EQ(expanded, params.expected); + EXPECT_EQ(expanded, params.expected) << " expected " << params.expected << + " got '" << expanded->AsString(); } INSTANTIATE_TEST_SUITE_P(TestExpandEnv, TestExpandEnv, testing::Values( EnvData{{}, "hello", "hello"}, EnvData{{{"world", "world"}}, "hello ${world}", "hello world"}, + EnvData{{{"hello", "hello"}}, "${hello} world", "hello world"}, + EnvData{{{"hello", "welcome"}}, "${hello} world", "welcome world"}, + EnvData{{{"a", "abcdefghi"}}, "${a} world", "abcdefghi world"}, + EnvData{{{"a", "abcdefghi"}}, "xxx ${a} world", "xxx abcdefghi world"}, + EnvData{{{"abcdefghi", "a"}}, "${abcdefghi} world", "a world"}, + EnvData{{{"abcdefghi", "a"}}, "xxx ${abcdefghi} y", "xxx a y"}, EnvData{{{"mm93", "marc marquez"}, {"vr46", "valentino rossi"}}, "motogp ${mm93} and ${vr46} greats", diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 4923b82c..00000000 --- a/src/Makefile +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright 2018 Eli Lilly and Company -# -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -######################################################################## - -IWPROGRAMMES ?= $(PWD)/.. -UNAME ?= Linux-gcc-6.2.0 - -prefix = $(IWPROGRAMMES) -exec_prefix = $(prefix) - -CP=cp -p - -SUBDIRS := $(wildcard */.) - -.PHONY : $(SUBDIRS) -.PHONY : $(DO_X) -.PHONY: copy_include -.PHONY: library -.PHONY: copy_library -.PHONY: exe -.PHONY: copy_exe -.PHONY: clean -.PHONY: veryclean - - -DO_X = do-clean\ - do-veryclean\ - do-copy_include\ - do-library\ - do-copy_library\ - do-exe\ - do-copy_exe - -# Enter each directory to build -$(DO_X): - @target=`echo $@ | sed -e 's/^do-//'`; \ - for dir in $(SUBDIRS) ; do \ - cd $${dir} ; \ - if [ -f ./Makefile ]; \ - then \ - if [ "$${target}" != "veryclean" ] ; \ - then \ - if [ ! -d ./$(UNAME) ] ; \ - then \ - mkdir ./$(UNAME) ; \ - fi ; \ - fi; \ - IWPROGRAMMES=$(IWPROGRAMMES) UNAME=$(UNAME) BUILD_DIR=$(UNAME) CXX=$(CXX) $(MAKE) -f Makefile $${target} ; \ - if [ "$${target}" = "veryclean" ] ; \ - then \ - if [ -d ./$(UNAME) ] ; \ - then \ - rm -r ./$(UNAME) ; \ - fi ; \ - fi; \ - fi; \ - cd ..;\ - done; - -copy_include: do-copy_include - -veryclean: do-veryclean - -clean: do-clean - -exe: do-exe - -copy_exe: do-copy_exe - -library: do-library - -copy_library: do-copy_library diff --git a/src/Molecule_Lib/BUILD b/src/Molecule_Lib/BUILD index 05cd5367..6835200a 100644 --- a/src/Molecule_Lib/BUILD +++ b/src/Molecule_Lib/BUILD @@ -1,4 +1,5 @@ load("@rules_proto//proto:defs.bzl", "proto_library") +load("@com_google_protobuf//:protobuf.bzl", "py_proto_library") package(default_visibility = ["//visibility:public"]) @@ -25,6 +26,13 @@ cc_proto_library( ], ) +py_proto_library( + name = "atom_type_ext_py_proto", + srcs = [ + "atom_type_ext.proto", + ], +) + proto_library( name = "donor_acceptor_proto", srcs = [ @@ -53,6 +61,13 @@ cc_proto_library( ], ) +py_proto_library( + name = "mol2graph_py_proto", + srcs = [ + "mol2graph.proto", + ], +) + proto_library( name = "geometric_constraints_proto", srcs = [ @@ -67,6 +82,14 @@ cc_proto_library( ], ) +py_proto_library( + name = "geometric_constraints_py_proto", + srcs = [ + "geometric_constraints.proto", + ], + visibility = ["//visibility:public"], +) + proto_library( name = "substructure_proto", srcs = [ @@ -83,6 +106,15 @@ cc_proto_library( ":substructure_proto", ], ) +py_proto_library( + name = "substructure_py_proto", + srcs = ["substructure.proto"], + deps = [ + "geometric_constraints_py_proto", + ], + visibility = ["//visibility:public"], +) + proto_library( name = "reaction_proto", @@ -102,6 +134,18 @@ cc_proto_library( ], ) +py_proto_library( + name = "reaction_py_proto", + srcs = [ + "reaction.proto", + ], + deps = [ + "substructure_py_proto", + "toggle_kekule_form_py_proto", + ], + visibility = ["//visibility:public"], +) + proto_library( name = "toggle_kekule_form", srcs = [ @@ -119,6 +163,17 @@ cc_proto_library( ], ) +py_proto_library( + name = "toggle_kekule_form_py_proto", + srcs = [ + "toggle_kekule_form.proto", + ], + deps = [ + ":substructure_py_proto", + ], + visibility = ["//visibility:public"], +) + cc_library( name = "coordinate_box", srcs = [ diff --git a/src/Molecule_Lib/atom.h b/src/Molecule_Lib/atom.h index 012dc51d..0ac55521 100644 --- a/src/Molecule_Lib/atom.h +++ b/src/Molecule_Lib/atom.h @@ -6,6 +6,8 @@ #include #include +#include "Foundational/iwaray/iwaray.h" + #include "coordinates.h" #include "element.h" #include "iwmtypes.h" diff --git a/src/Molecule_Lib/atom_pair_fingerprint.h b/src/Molecule_Lib/atom_pair_fingerprint.h index 1d9e209a..64d2e15d 100644 --- a/src/Molecule_Lib/atom_pair_fingerprint.h +++ b/src/Molecule_Lib/atom_pair_fingerprint.h @@ -12,8 +12,13 @@ namespace atom_pair_fingerprint { +using atom_type_t = uint64_t; + class AtomPairFingerprint { + public: + private: + // In order to avoid passing long argument lists. class APairOfAtoms { public: @@ -80,8 +85,6 @@ class AtomPairFingerprint { } }; - public: - using uint64_t = atom_type_t; private: // _min_separation will default to 1, which is 1 bond. Set to zero // to get bits corresponding to atom types themselves. diff --git a/src/Molecule_Lib/atom_typing.h b/src/Molecule_Lib/atom_typing.h index 0cef11c9..a5eaffbe 100644 --- a/src/Molecule_Lib/atom_typing.h +++ b/src/Molecule_Lib/atom_typing.h @@ -1,6 +1,9 @@ #ifndef MOLECULE_LIB_ATOM_TYPING_H_ #define MOLECULE_LIB_ATOM_TYPING_H_ +#include + +#include "Foundational/iwaray/iwaray.h" #include "Foundational/iwbits/iwbits.h" #include "Foundational/iwstring/iwstring.h" diff --git a/src/Molecule_Lib/bond.h b/src/Molecule_Lib/bond.h index a25e347b..456bc8fb 100644 --- a/src/Molecule_Lib/bond.h +++ b/src/Molecule_Lib/bond.h @@ -4,12 +4,12 @@ #include #include +#include "Foundational/iwstring/iwstring.h" + #include "iwmtypes.h" class Molecule; -class IWString; - class Connection { protected: diff --git a/src/Molecule_Lib/charge_assigner.h b/src/Molecule_Lib/charge_assigner.h index 462483bc..7870c1ca 100644 --- a/src/Molecule_Lib/charge_assigner.h +++ b/src/Molecule_Lib/charge_assigner.h @@ -1,12 +1,13 @@ #ifndef MOLECULE_LIB_CHARGE_ASSIGNER_H_ #define MOLECULE_LIB_CHARGE_ASSIGNER_H_ -/* -*/ +#include + +#include "Foundational/iwaray/iwaray.h" #include "iwmtypes.h" -#include "temp_detach_atoms.h" #include "qry_wstats.h" +#include "temp_detach_atoms.h" class Substructure_Hit_Statistics; class Single_Substructure_Query; diff --git a/src/Molecule_Lib/chiral_centre.h b/src/Molecule_Lib/chiral_centre.h index 2c95879e..dd05982c 100644 --- a/src/Molecule_Lib/chiral_centre.h +++ b/src/Molecule_Lib/chiral_centre.h @@ -1,11 +1,13 @@ #ifndef MOLECULE_LIB_CHIRAL_CENTRE_H_ #define MOLECULE_LIB_CHIRAL_CENTRE_H_ +#include + #include "Foundational/iwaray/iwaray.h" +#include "Foundational/iwstring/iwstring.h" #include "iwmtypes.h" -class IWString; class Molecule; class Bond; diff --git a/src/Molecule_Lib/donor_acceptor.h b/src/Molecule_Lib/donor_acceptor.h index 5538d94e..fba955c4 100644 --- a/src/Molecule_Lib/donor_acceptor.h +++ b/src/Molecule_Lib/donor_acceptor.h @@ -1,6 +1,10 @@ #ifndef MOLECULE_LIB_DONOR_ACCEPTOR_H_ #define MOLECULE_LIB_DONOR_ACCEPTOR_H_ +#include + +#include "Foundational/iwaray/iwaray.h" +#include "Foundational/iwstring/iwstring.h" #include "Molecule_Lib/donor_acceptor.pb.h" #include "output.h" #include "temp_detach_atoms.h" diff --git a/src/Molecule_Lib/element.cc b/src/Molecule_Lib/element.cc index 71927e93..b35c2d2f 100644 --- a/src/Molecule_Lib/element.cc +++ b/src/Molecule_Lib/element.cc @@ -1485,17 +1485,15 @@ debug_print_all_elements(std::ostream & os) { assert (os.good()); - if (elements.empty()) - { + if (elements.empty()) { os << "Element array not initialised\n"; return; } int nelements = elements.number_elements(); - for (int i = 0; i < nelements; i++) - { - os << "Element number " << i << endl; + for (int i = 0; i < nelements; i++) { + os << "Element number " << i << ' '; elements[i]->debug_print(os); } diff --git a/src/Molecule_Lib/element.h b/src/Molecule_Lib/element.h index b0fbc883..06909192 100644 --- a/src/Molecule_Lib/element.h +++ b/src/Molecule_Lib/element.h @@ -11,8 +11,10 @@ #define REASONABLE_ATOMIC_NUMBER(z) ((z) >= 0 && (z) <= HIGHEST_ATOMIC_NUMBER) +#include #include +#include "Foundational/iwaray/iwaray.h" #include "Foundational/iwstring/iwstring.h" #include "iwmtypes.h" diff --git a/src/Molecule_Lib/element_hits_needed.cc b/src/Molecule_Lib/element_hits_needed.cc index 75660edb..b3db4f84 100644 --- a/src/Molecule_Lib/element_hits_needed.cc +++ b/src/Molecule_Lib/element_hits_needed.cc @@ -138,11 +138,17 @@ Elements_Needed::matches(Molecule_to_Match & target_molecule) const } const int number_elements = _elements.number_elements(); + // Should make this part of the class since it is needed each time + resizable_array uids; + for (const Element* e : _elements) { + uids << e->unique_id(); + } + int * found = new_int(number_elements); std::unique_ptr free_found(found); int nhits = 0; const Molecule* m = target_molecule.molecule(); for (const Atom * a : *m) { - const int ndx = _elements.index(a->element()); + const int ndx = uids.index(a->element()->unique_id()); if (ndx >= 0) { found[ndx]++; ++nhits; @@ -156,12 +162,16 @@ int Elements_Needed::_matches_single_element(Molecule_to_Match & target_molecule) const { const Molecule& m = *target_molecule.molecule(); - const Element* e0 = _elements[0]; + + auto uid = _elements[0]->unique_id(); + int nhits = 0; + for (const Atom* a : m) { - if (a->element() == e0) { + if (a->element()->unique_id() == uid) { ++nhits; } } + return _hits_needed.matches(nhits); } diff --git a/src/Molecule_Lib/geometric_constraints.h b/src/Molecule_Lib/geometric_constraints.h index 3de61777..06d3f310 100644 --- a/src/Molecule_Lib/geometric_constraints.h +++ b/src/Molecule_Lib/geometric_constraints.h @@ -2,7 +2,12 @@ #define MOLECULE_LIB_GEOMETRIC_CONSTRAINTS_H // Geometry matching conditions. +#include + +#include "Foundational/iwaray/iwaray.h" + #include "molecule.h" +#include "set_of_atoms.h" #include "space_vector.h" #include "Molecule_Lib/geometric_constraints.pb.h" diff --git a/src/Molecule_Lib/iwmfingerprint.h b/src/Molecule_Lib/iwmfingerprint.h index 3ea09f03..a0903406 100644 --- a/src/Molecule_Lib/iwmfingerprint.h +++ b/src/Molecule_Lib/iwmfingerprint.h @@ -1,7 +1,9 @@ #ifndef MOLECULE_LIB_IWMFINGERPRINT_H_ #define MOLECULE_LIB_IWMFINGERPRINT_H_ +#include "Foundational/iwaray/iwaray.h" #include "Foundational/iwbits/iwbits.h" +#include "Foundational/iwstring/iwstring.h" #include "atom_typing.h" diff --git a/src/Molecule_Lib/iwreaction.h b/src/Molecule_Lib/iwreaction.h index 81338016..0ae19765 100644 --- a/src/Molecule_Lib/iwreaction.h +++ b/src/Molecule_Lib/iwreaction.h @@ -1,11 +1,17 @@ #ifndef MOLECULE_LIB_IWREACTION_H_ #define MOLECULE_LIB_IWREACTION_H_ +#include +#include #include +#include +#include "Foundational/iwaray/iwaray.h" #include "Foundational/cmdline/cmdline.h" #include "Foundational/iwmisc/msi_object.h" +#include "Foundational/iwstring/iwstring.h" +#include "iwmtypes.h" #include "istream_and_type.h" #include "reaction_match_conditions.h" #include "Molecule_Lib/reaction.pb.h" diff --git a/src/Molecule_Lib/iwstandard.h b/src/Molecule_Lib/iwstandard.h deleted file mode 100644 index 2ce80502..00000000 --- a/src/Molecule_Lib/iwstandard.h +++ /dev/null @@ -1,509 +0,0 @@ -#ifndef MOLECULE_LIB_IWSTANDARD_H_ -#define MOLECULE_LIB_IWSTANDARD_H_ - -/* - For each transformation we keep track of things processed -*/ - -#include - -class Molecule; -class Atom; -class Command_Line; - -#include "iwmtypes.h" - -#include "set_of_atoms.h" - -class Chemical_Transformation -{ - private: - int _active; - int _groups_changed; - int _molecules_changed; - - public: - Chemical_Transformation (); - ~Chemical_Transformation (); - - int active () const { return _active;} - void activate () { _active = 1;} - void deactivate () { _active = 0;} - - int molecules_changed () const { return _molecules_changed;} - int groups_changed () const { return _groups_changed;} - - void extra (int); - - int report (std::ostream & ) const; -}; - -class Possible_Lactim_Lactam -{ - private: - const atom_number_t _oxygen; - const atom_number_t _carbon; - atom_number_t _nitrogen; - - atom_number_t _second_nitrogen; // two connected, could be part of another lactam/lactim - - int _total_nitrogen_attachments; // might be 2, but one might be 3 connected - - int _shared_nitrogen_group; - - atom_number_t _alpha_nitrogen; // bonded to either _nitrogen or _second_nitrogen - - int _is_ring; - int _fused_system_size; - int _fused_system_identifier; - int _lactims_in_fused_system; - int _aromatic; - int _ring_size; - int _lactam_form; - int _is_urea; - - int _made_change; // keep track of result of to_lactim_form() call - -// private functions - - int _alpha_nitrogen_present (const Molecule & m, const atom_number_t n) const; - - public: - Possible_Lactim_Lactam (atom_number_t o, atom_number_t c, atom_number_t n); - - atom_number_t oxygen () const { return _oxygen;} - atom_number_t carbon () const { return _carbon;} - atom_number_t nitrogen () const { return _nitrogen;} - - void set_is_ring (int s) { _is_ring = s;} - void set_fused_system_size (int s) { _fused_system_size = s;} - void set_fused_system_identifier (int s) { _fused_system_identifier = s;} - void set_aromatic (int s) { _aromatic = s;} - void set_ring_size (int s) { _ring_size = s;} - void set_lactam_form (int s) { _lactam_form = s;} - void set_second_nitrogen (atom_number_t s) { _second_nitrogen = s;} - void set_total_nitrogen_attachments (atom_number_t s) { _total_nitrogen_attachments = s;} - void set_shared_nitrogen_group (int s) { _shared_nitrogen_group = s;} - void set_is_urea (int s) { _is_urea = s;} - - int is_ring () const { return _is_ring;} - int fused_system_size () const { return _fused_system_size;} - int fused_system_identifier () const { return _fused_system_identifier;} - int ring_size () const { return _ring_size;} - int aromatic () const { return _aromatic;} - int lactam_form () const { return _lactam_form;} - atom_number_t second_nitrogen () const { return _second_nitrogen;} - atom_number_t total_nitrogen_attachments () const { return _total_nitrogen_attachments;} - int shared_nitrogen_group () const { return _shared_nitrogen_group;} - int is_urea () const { return _is_urea;} - - int shares_nitrogen_with (const Possible_Lactim_Lactam & rhs) const; - - int discern_alpha_nitrogen (Molecule & m); - atom_number_t alpha_nitrogen() const { return _alpha_nitrogen;} - - void increment_lactims_in_fused_system () { _lactims_in_fused_system++;} - int lactims_in_fused_system () const { return _lactims_in_fused_system;} - - int to_lactim_form (Molecule & m, int check_nitrogen_hcount); - int to_lactam_form (Molecule & m, int check_nitrogen_hcount); - int made_change () const { return _made_change;} - - int hcount (Molecule &) const; - int could_change_to_lactim_with_current_bonding (const Molecule & m) const; - - int add_unique_nitrogens (Set_of_Atoms & unique_nitrogens) const; - int reperceive (Molecule & m); -}; - -/* - for thread safety, the Chemical_Standardisation object needs a stack - based object in which it can hold attributes of the current molecule - being processed -*/ - -class IWStandard_Current_Molecule -{ - private: - int _matoms; - int _nrings; - atomic_number_t * _atomic_number; - int * _ncon; - int * _ring_membership; - int * _ring_size; - int * _ring_is_fused; - int * _atom_is_aromatic; - int * _ring_is_aromatic; - int * _fsid; - const Atom ** _atom; - - int * _ring_nitrogen_count; - - int _sulphur; - int _nneg; // number of negative charges - int _npos; // number of positive charges - int _ominus; // O- - int _sminus; // S- - int _nplus; // N+ - int _cminus; // C- - int _splus; // S+ - -// needed for reverse transformations - - int _nitrogens; - int _oxygens; - int _phosphorus; - - int _isolated_metal; - int _isolated_halogen; - int _singly_connected_metal; - Set_of_Atoms _possible_guanidine; - int _explicit_hydrogen_count; - - int _possible_valence_errors; - - resizable_array_p _possible_lactam; - -// We save the rings because they may get recomputed during our changes - - resizable_array_p _rings; - -// private functions - - public: - IWStandard_Current_Molecule(); - ~IWStandard_Current_Molecule(); - - int initialise (Molecule &); - - int processing_needed () const; - - const atomic_number_t * atomic_number () const { return _atomic_number;} - const Atom * const * atoms () { return _atom;} - const int * ncon () const { return _ncon;} - const int * ring_membership () const { return _ring_membership;} - const int * ring_size () const { return _ring_size;} - const int * ring_is_fused () const { return _ring_is_fused;} - const int * ring_is_aromatic () const { return _ring_is_aromatic;} - const int * atom_is_aromatic () const { return _atom_is_aromatic;} - const int * ring_nitrogen_count () const { return _ring_nitrogen_count;} - -// Some methods are non const - - int * ncon () { return _ncon;} - - int nrings () const { return _nrings;} - - int aromatic_rings_with_multiple_nitrogens () const; - - void change_sulphur (int s) { _sulphur += s;} - void change_nneg (int s) { _nneg += s;} - void change_npos (int s) { _npos += s;} - void change_ominus (int s) { _ominus += s;} - void change_sminus (int s) { _sminus += s;} - void change_splus (int s) { _splus += s;} - void change_nplus (int s) { _nplus += s;} - void change_cminus (int s) { _cminus += s;} - void change_nitrogens (int s) { _nitrogens += s;} - void change_oxygens (int s) { _oxygens += s;} - void change_isolated_metal (int s) { _isolated_metal += s;} - void change_isolated_halogen (int s) { _isolated_halogen += s;} - void change_singly_connected_metal (int s) { _singly_connected_metal += s;} -// void change_possible_guanidine (int s) { _possible_guanidine += s;} - void change_phosphorus (int s) { _phosphorus += s;} - void change_explicit_hydrogen_count (int s) { _explicit_hydrogen_count += s;} - void change_possible_valence_errors (int s) { _possible_valence_errors += s;} - - void set_sulphur (int s) { _sulphur = s;} - void set_nneg (int s) { _nneg = s;} - void set_npos (int s) { _npos = s;} - void set_ominus (int s) { _ominus = s;} - void set_sminus (int s) { _sminus = s;} - void set_nplus (int s) { _nplus = s;} - void set_cminus (int s) { _cminus = s;} - void set_nitrogens (int s) { _nitrogens = s;} - void set_oxygens (int s) { _oxygens = s;} - void set_isolated_metal (int s) { _isolated_metal = s;} - void set_isolated_halogen (int s) { _isolated_halogen = s;} - void set_singly_connected_metal (int s) { _singly_connected_metal = s;} -// void set_possible_guanidine (int s) { _possible_guanidine = s;} - void set_phosphorus (int s) { _phosphorus = s;} - void set_explicit_hydrogen_count (int s) { _explicit_hydrogen_count = s;} - void set_possible_valence_errors (int s) { _possible_valence_errors = s;} - - int sulphur () const { return _sulphur;} - int nneg () const { return _nneg;} - int npos () const { return _npos;} - int ominus () const { return _ominus;} - int sminus () const { return _sminus;} - int splus () const { return _splus;} - int nplus () const { return _nplus;} - int cminus () const { return _cminus;} - int nitrogens () const { return _nitrogens;} - int oxygens () const { return _oxygens;} - int isolated_metal () const { return _isolated_metal;} - int isolated_halogen () const { return _isolated_halogen;} - int singly_connected_metal () const { return _singly_connected_metal;} - const Set_of_Atoms & possible_guanidine () const { return _possible_guanidine;} - int phosphorus () const { return _phosphorus;} - int explicit_hydrogen_count () const { return _explicit_hydrogen_count;} - int possible_valence_errors () const { return _possible_valence_errors;} - const resizable_array_p & possible_lactam() const { return _possible_lactam;} - - int remove_possible_guanidine (const atom_number_t); - - int ring_number_containing_atom (const atom_number_t s) const; - const Set_of_Atoms * ring_containing_atom (const atom_number_t) const; - const Set_of_Atoms * ringi (const int) const; - - int fused_system_identifier (const atom_number_t s) const { return _fsid[s];} -}; - -// Names of chemical standardisations. Pass to Activate() to turn on -// individual transformations. Should transition to an enum. -#define CS_NITRO "nitro" -#define CS_NpOm "n+o-" -#define CS_NpNm "n+n-" -#define CS_SpCm "s+c-" -#define CS_ALLpm "all+-" -#define CS_XH "xh" -#define CS_NpH3 "n+h3" -#define CS_AMINE "amine" -#define CS_Om "o-" -#define CS_Nm "n-" -#define CS_ALL "all" -#define CS_NRMCH "nrmch" -#define CS_COVM "covm" -#define CS_ISOLC "isolc" -#define CS_GUAND "guan" -#define CS_GUANDR "Rguan" -#define CS_SPOM "s+o-" -#define CS_ACID "acid" -#define CS_EHLST "ehlast" -#define CS_FMRK "fmrk" -#define CS_AZID "azid" -#define CS_MSDUR "msdur" -#define CS_MSDSA "msdsa" -#define CS_FCRN "fcor" -#define CS_RNPNM "Rn+n-" -#define CS_FWIH "fwih" -#define CS_IMIDAZOLE "imidazole" -#define CS_CHARGED_IMIDAZOLE "charged_imidazole" -#define CS_PYRAZOLE "pyrazole" -#define CS_TRIAZOLE "triazole" -#define CS_TETRAZOLE "tetrazole" -#define CS_LACTIM_LACTAM "ltlt" -#define CS_LACTIM_LACTAM_RING "ltltr" -#define CS_REVERSE_NITRO "rvnitro" -#define CS_REVERSE_NV5 "rvnv5" -#define CS_ISOXAZOLE "isoxazole" -#define CS_ARGUAN "arguan" -#define CS_PYRAZOLONE "pirazolone" -#define CS_AMINO_THIAZOLE "aminothazole" - - -/* - As you add standardisations, make sure you update the code around the "all" directive -*/ - -class Chemical_Standardisation -{ - private: - int _ok; - int _verbose; - int _active; - - int _molecules_processed; - int _molecules_changed; - -// Our default set of conventions - - Chemical_Transformation _transform_amines; - Chemical_Transformation _transform_nitro; - Chemical_Transformation _transform_nplus_ominus; - Chemical_Transformation _transform_plus_minus; - Chemical_Transformation _transform_n_charge_sep; - Chemical_Transformation _protonate_no; - Chemical_Transformation _remove_hydrogens; - Chemical_Transformation _protonate_carboxyllic_acids; - Chemical_Transformation _protonate_sulfonic_acids; - Chemical_Transformation _protonate_sulfinic_acids; - Chemical_Transformation _transform_splus_cminus; - Chemical_Transformation _transform_ominus; - Chemical_Transformation _transform_nminus; - Chemical_Transformation _transform_covalent_metals; - Chemical_Transformation _transform_single_atom_ions; - Chemical_Transformation _transform_guanidine; - Chemical_Transformation _transform_guanidine_ring; - Chemical_Transformation _protonate_sulfur_acids; - Chemical_Transformation _protonate_phosphorous_acids; - Chemical_Transformation _from_mrk_standardisations; - Chemical_Transformation _explicit_hydrogens_last; - Chemical_Transformation _transform_tetrazole; - Chemical_Transformation _transform_azid; - Chemical_Transformation _transform_isoxazole; - Chemical_Transformation _transform_misdrawn_sulfonamide; - Chemical_Transformation _transform_misdrawn_urea; - Chemical_Transformation _transform_imidazole; - Chemical_Transformation _transform_charged_imidazole; - Chemical_Transformation _transform_pyrazole; - Chemical_Transformation _transform_triazole; - Chemical_Transformation _transform_lactim_lactam; - Chemical_Transformation _transform_lactim_lactam_ring; - Chemical_Transformation _transform_aromatic_guanidine_ring; - Chemical_Transformation _transform_pyrazolone; - Chemical_Transformation _transform_amino_thiazole; - -// Various reverse direction transformations - - Chemical_Transformation _transform_nitro_reverse; - Chemical_Transformation _transform_azid_reverse; - Chemical_Transformation _transform_back_to_nplus_nminus; - Chemical_Transformation _transform_nv5_to_charge_separated; - Chemical_Transformation _transform_to_charge_separated_azid; - - Chemical_Transformation _transform_obvious_implicit_hydrogen_errors; - - int _remove_hydrogens_attached_to_chiral_centres; - -// Sometimes it is useful to flag changes. Either a single text appended to -// all changed molecules - - IWString _append_to_changed_molecules; - -// or a string that tells exactly what was done - - int _append_string_depending_on_what_changed; - - int _check_valence_before_and_after; - -// Some other possibilities - - -// private functions - - void _default_values (); - - void _do_transform_plus_minus_pair (Molecule & m, atom_number_t a1, atom_number_t a2, IWStandard_Current_Molecule & current_molecule_data); - - int _do_transform_amines (Molecule &, Set_of_Atoms &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_nitro (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_nplus_ominus (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_nv5_to_charge_separated(Molecule & m, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_plus_minus (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_n_charge_sep (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_azid_to_charge_separated (Molecule & m, IWStandard_Current_Molecule & current_molecule_data); - int _do_protonate_no (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_remove_hydrogens (Molecule &); - int _do_protonate_carboxyllic_acids (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_protonate_sulfonic_acids (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_protonate_sulfinic_acids (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_splus_cminus (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_ominus (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_nminus (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_covalent_metals (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_covalent_metals (Molecule & m); - int _do_transform_guanidine (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_ring_guanidine (Molecule & m, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_aromatic_ring_guanidine (Molecule & m, const Set_of_Atoms & r, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_aromatic_ring_guanidine (Molecule & m, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_single_atom_ions (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_protonate_sulfur_acids (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_protonate_phosphorous_acids (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_from_mrk_standardisations (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_tetrazole (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_tetrazole (Molecule &, const Set_of_Atoms &, IWStandard_Current_Molecule & current_molecule_data); - int _do_charged_imidazole(Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_charged_imidazole(Molecule &, const int ring_number, IWStandard_Current_Molecule & current_molecule_data); - int _do_imidazole (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_imidazole (Molecule &, const int, IWStandard_Current_Molecule & current_molecule_data); - int _swap_imidazole (Molecule & m, atom_number_t n1, atom_number_t c, atom_number_t n2) const; - int _do_pyrazole (Molecule &, int * atom_already_changed, IWStandard_Current_Molecule & current_molecule_data); - int _do_pyrazole (Molecule &, int * atom_already_changed, const int, IWStandard_Current_Molecule & current_molecule_data); - int _do_triazole (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_triazole (Molecule &, const Set_of_Atoms &, const Set_of_Atoms * is_fused, IWStandard_Current_Molecule & current_molecule_data); -// int _do_123_triazole (Molecule & m, const Ring & r, int n1_index_in_ring, int n2_index_in_ring, int n3_index_in_ring, const atomic_number_t * z, const int * ncon, Atom ** atoms); - int _do_123_triazole (Molecule & m, const Set_of_Atoms & r, int n1_index_in_ring, int n2_index_in_ring, int n3_index_in_ring, int c4_index_in_ring, int c5_index_in_ring, IWStandard_Current_Molecule &, const Set_of_Atoms * is_fused) const; - int _do_134_triazole (Molecule & m, const Set_of_Atoms & r, int n1_index_in_ring, int c2_index_in_ring, int n3_index_in_ring, int n4_index_in_ring, int c5_index_in_ring, IWStandard_Current_Molecule &) const; -// int _do_134_triazole (Molecule & m, const Ring & r, int n1_index_in_ring, int n2_index_in_ring, int n3_index_in_ring, const atomic_number_t * z, const int * ncon, Atom ** atoms); - int _do_isoxazole (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_isoxazole (Molecule &, const Set_of_Atoms &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_azid (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_misdrawn_urea (Molecule & m, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_misdrawn_sulfonamide (Molecule & m, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_misdrawn_sulfonamide (Molecule & m, const atom_number_t s, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_back_to_nplus_nminus (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_explicit_hydrogens_last (Molecule &); - int _do_amino_thiazole (Molecule &, int * atom_already_changed, IWStandard_Current_Molecule & current_molecule_data); - int _do_amino_thiazole (Molecule & m, const Set_of_Atoms & r, const int * atom_already_changed, IWStandard_Current_Molecule & current_molecule_data); - - int _lactim_lactam_process_if_all_groups_non_overlapping (Molecule & m, const resizable_array & in_system, - int * already_done, IWStandard_Current_Molecule & current_molecule_data); - int _do_lactam_lactim_pyrazole_triazole (Molecule & m, const Possible_Lactim_Lactam & p, const Set_of_Atoms & r, IWStandard_Current_Molecule & current_molecule_data); - int _do_lactam_lactim_pyrazole_triazole (Molecule & m, const resizable_array_p &, int * atom_already_changed, int * already_done, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_ring_lactim(Molecule &, int * atom_already_changed, IWStandard_Current_Molecule & current_molecule_data); - int __do_transform_ring_lactim (Molecule & m, int * atom_already_changed, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_non_ring_lactim(Molecule &, int * atom_already_changed, IWStandard_Current_Molecule & current_molecule_data); - int _toggle_kekule_forms_to_lactim_form (Molecule & m, IWStandard_Current_Molecule & current_molecule_data) const; - int _change_molecule_kekule_form_for_lactam_canonical (Molecule & m, Possible_Lactim_Lactam & p); - int _handle_one_lactim_lactam_in_ring_system (Molecule & m, Possible_Lactim_Lactam & p, - IWStandard_Current_Molecule & current_molecule_data) const; - int _handle_two_nitrogens_sharing_an_oxygen (Molecule & m, Possible_Lactim_Lactam & p1, - Possible_Lactim_Lactam & p2, - IWStandard_Current_Molecule & current_molecule_data) const; - int _identify_and_handle_two_nitrogens_sharing_an_oxygen (Molecule & m, resizable_array & s, - IWStandard_Current_Molecule & current_molecule_data) const; - int _process_lactim_in_isolated_aromatic_ring (Molecule & m, Possible_Lactim_Lactam & p, - IWStandard_Current_Molecule & current_molecule_data); - - int _do_transform_reverse_nitro (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_reverse_azid (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - - int _do_transform_pyrazolone (Molecule & m, int * atom_already_changed, IWStandard_Current_Molecule & current_molecule_data); - int _do_transform_pyrazolone (Molecule & m, const Set_of_Atoms & ri, const int ring_is_fused, int * atom_already_changed, IWStandard_Current_Molecule & current_molecule_data); - - int _do_transform_implicit_hydrogen_known_errors (Molecule & m, IWStandard_Current_Molecule & current_molecule_data); - - int _process (Molecule &); - int _process (Molecule &, IWStandard_Current_Molecule & current_molecule_data); - - int _processing_needed (const IWStandard_Current_Molecule & current_molecule_data) const; - - public: - Chemical_Standardisation (); - ~Chemical_Standardisation (); - - int ok () const; - int debug_print (std::ostream &) const; - - int active () const { return _active;} - - void set_verbose (int v) { _verbose = v;} - - int construct_from_command_line (Command_Line &, int = 0, char = 'g'); - - // Turn on individual chemical transformations based on the name. - int Activate(const IWString& directive, const int verbose); - - int process (Molecule &); - - int report (std::ostream &) const; - - void activate_all (); - - int activate_all_except_hydrogen_removal (); - - void deactivate_lactim_lactam (); - - int activate_from_corina_transformations(); - - void deactivate () { _active = 0;} - - int deactivate (const const_IWSubstring &); -}; - -extern int display_standard_chemical_standardisation_options (std::ostream &, char); - -extern void set_update_chemical_standardisation_accumulators (int s); - -#endif // MOLECULE_LIB_IWSTANDARD_H_ diff --git a/src/Molecule_Lib/iwsubstructure.cc b/src/Molecule_Lib/iwsubstructure.cc index dde22367..5d80c864 100644 --- a/src/Molecule_Lib/iwsubstructure.cc +++ b/src/Molecule_Lib/iwsubstructure.cc @@ -1280,6 +1280,14 @@ Single_Substructure_Query::_global_query_conditions_also_matched(Query_Atoms_Mat } } + if (_nearby_atoms.size() > 0) { + for (NearbyAtoms* n : _nearby_atoms) { + if (! n->Matches(target_molecule, matched_query_atoms, already_matched)) { + return 0; + } + } + } + #ifdef DEBUG_MATCHED_ATOM_POST_CHECK cerr << "Global conditions OK\n"; #endif diff --git a/src/Molecule_Lib/marvin.h b/src/Molecule_Lib/marvin.h index 564d3214..083704c2 100644 --- a/src/Molecule_Lib/marvin.h +++ b/src/Molecule_Lib/marvin.h @@ -1,6 +1,10 @@ #ifndef MOLECULE_LIB_MARVIN_H_ #define MOLECULE_LIB_MARVIN_H_ +#include + +#include "Foundational/iwaray/iwaray.h" +#include "Foundational/iwstring/iwstring.h" #include "Foundational/iwstring/iw_stl_hash_map.h" class Marvin_Structure_Information diff --git a/src/Molecule_Lib/mdl.h b/src/Molecule_Lib/mdl.h index 151647ea..3e646b4a 100644 --- a/src/Molecule_Lib/mdl.h +++ b/src/Molecule_Lib/mdl.h @@ -1,10 +1,14 @@ #ifndef MOLECULE_LIB_MDL_H_ #define MOLECULE_LIB_MDL_H_ +#include #include #include "re2/re2.h" +#include "Foundational/iwaray/iwaray.h" +#include "Foundational/iwstring/iwstring.h" + #include "atom.h" #include "atom_alias.h" #include "iwmtypes.h" diff --git a/src/Molecule_Lib/molecule.h b/src/Molecule_Lib/molecule.h index 39f5014b..c7266686 100644 --- a/src/Molecule_Lib/molecule.h +++ b/src/Molecule_Lib/molecule.h @@ -1,10 +1,13 @@ #ifndef MOLECULE_LIB_MOLECULE_H_ #define MOLECULE_LIB_MOLECULE_H_ +#include +#include #include #include -#include #include +#include +#include #include #ifdef IW_USE_TBB_SCALABLE_ALLOCATOR @@ -17,6 +20,7 @@ struct XMLNode; Header file for Molecule objects */ +#include "Foundational/iwaray/iwaray.h" #include "Foundational/iwstring/iwstring.h" #include "Foundational/iwbits/iwbits.h" class iwstring_data_source; @@ -24,13 +28,15 @@ class iwstring_data_source; #include "iwmtypes.h" #include "atom.h" +#include "bond.h" #include "bond_list.h" #include "collection_template.h" #include "coordinates.h" +#include "element.h" +#include "iwrcb.h" #include "mol2graph.h" #include "set_of_atoms.h" - // forward declaration class Molecule; @@ -262,8 +268,6 @@ class Fragment_Information { int all_atoms_in_one_fragment(int natoms, int nbonds); // initialise the structure }; -#include "iwrcb.h" - /* Once fragments, rings and aromaticity are known, we can generate a smiles ordering diff --git a/src/Molecule_Lib/pearlman.h b/src/Molecule_Lib/pearlman.h index 05167555..fd8955aa 100644 --- a/src/Molecule_Lib/pearlman.h +++ b/src/Molecule_Lib/pearlman.h @@ -1,6 +1,9 @@ #ifndef MOLECULE_LIB_PEARLMAN_SSSR_H_ #define MOLECULE_LIB_PEARLMAN_SSSR_H_ +#include + +#include "Foundational/iwaray/iwaray.h" #include "Foundational/iwbits/iwbits.h" #include "iwmtypes.h" diff --git a/src/Molecule_Lib/qry_wstats.h b/src/Molecule_Lib/qry_wstats.h index 4ebd8fca..2d96e480 100644 --- a/src/Molecule_Lib/qry_wstats.h +++ b/src/Molecule_Lib/qry_wstats.h @@ -1,8 +1,14 @@ #ifndef MOLECULE_LIB_QRY_WSTATS_H_ #define MOLECULE_LIB_QRY_WSTATS_H_ +#include + +#include "Foundational/iwaray/iwaray.h" +#include "Foundational/iwstring/iwstring.h" + #include "ostream_and_type.h" #include "substructure.h" +#include "Molecule_Lib/substructure.pb.h" /* This extension of a substructure query keeps track of the number of diff --git a/src/Molecule_Lib/rmele.h b/src/Molecule_Lib/rmele.h index 09780817..4c056cbc 100644 --- a/src/Molecule_Lib/rmele.h +++ b/src/Molecule_Lib/rmele.h @@ -6,6 +6,9 @@ removal. */ +#include "Foundational/iwaray/iwaray.h" +#include "Foundational/iwstring/iwstring.h" + class Molecule; class Command_Line; diff --git a/src/Molecule_Lib/rwmolecule.cc b/src/Molecule_Lib/rwmolecule.cc index 8fcf0e55..bb71094a 100644 --- a/src/Molecule_Lib/rwmolecule.cc +++ b/src/Molecule_Lib/rwmolecule.cc @@ -246,11 +246,13 @@ set_number_connection_table_errors_to_skip(int s) } /* - Radha had a problem with reading molecules from Cambridge. - They contain convalently bonded metals, but since they are - attached to aromatic rings, they mess up the Kekule detection. - We have the option of removing such things before Kekule - perception takes place. + Optionally remove all bonds from non-organic elements. + Possible values: + 0 do nothing + 1 remove all bonds to metals + 2 remove all bonds to a non-organic if all atoms attached are heteroatoms. + + TODO: make this an enumeration */ static int _unconnect_covalently_bonded_non_organics_on_read = 0; @@ -1047,6 +1049,8 @@ string_to_file_type(const const_IWSubstring & file_type) we need to remove any covalently bonded non-organics Nov 2007. Change this to only un-connect them when they are bonded only to heteroatoms + Oct 2023. More useful to make the default always remove all bonds. + The old behaviour can be obtained by setting _unconnect_covalently_bonded_non_organics_on_read=2 */ int @@ -1061,8 +1065,10 @@ Molecule::_do_unconnect_covalently_bonded_non_organics() if (a->element()->organic() || 0 == a->ncon()) continue; - if (attached_heteroatom_count(i) == a->ncon()) - { + if (_unconnect_covalently_bonded_non_organics_on_read == 1) { + remove_bonds_to_atom(1); + ++rc; + } else if (attached_heteroatom_count(i) == a->ncon()) { remove_bonds_to_atom(i); rc++; } diff --git a/src/Molecule_Lib/rwsubstructure.h b/src/Molecule_Lib/rwsubstructure.h index c9189200..02bb7023 100644 --- a/src/Molecule_Lib/rwsubstructure.h +++ b/src/Molecule_Lib/rwsubstructure.h @@ -1,6 +1,7 @@ #ifndef MOLECULE_LIB_RWSUBSTRUCTURE_H_ #define MOLECULE_LIB_RWSUBSTRUCTURE_H_ +#include #include #include #include @@ -675,6 +676,39 @@ read_one_or_more_queries_from_file(resizable_array_p & queries, return rc; } +// A record in a file of queries starts with "PROTO:". Build the +// file name, read the query and append to `queries`. +template +int +ReadProtoQuery(const IWString& fname, + const IWString& directory_path, + resizable_array_p& queries, + int verbose) { + assert(fname.starts_with("PROTO:")); + + const_IWSubstring myfname(fname); + myfname.remove_leading_chars(6); + + IWString pathname; + if (myfname.starts_with('/')) + pathname=myfname; + else if (directory_path.length()) + pathname = directory_path + myfname; + else + pathname = myfname; + + T * q = ReadProtoQueryFile(pathname); + if (nullptr == q) { + std::cerr << "ReadProtoQuery::cannot read proto file '" << pathname << "'\n"; + return 0; + } + + queries.add(q); + + return 1; +} + +// Read a single record from a file containing queries. template int file_record_is_file(resizable_array_p & queries, @@ -682,9 +716,12 @@ file_record_is_file(resizable_array_p & queries, IWString & buffer, int verbose) { + if (buffer.starts_with("PROTO:")) { + return ReadProtoQuery(buffer, directory_path, queries, verbose); + } + IWString fname; - if (! buffer.word(0, fname)) - { + if (! buffer.word(0, fname)) { std::cerr << "file_record_is_file: cannot get first word from '" << buffer << "'\n"; return 0; } @@ -727,7 +764,7 @@ queries_from_file(iwstring_data_source & input, resizable_array_p & queries, IWString buffer; while (input.next_record(buffer)) { - if (0 == buffer.length()) + if (buffer.empty()) continue; if ('#' == buffer[0]) @@ -740,8 +777,7 @@ queries_from_file(iwstring_data_source & input, resizable_array_p & queries, else rc_this_record = file_record_is_file(queries, directory_path, buffer, verbose); - if (0 == rc_this_record) - { + if (0 == rc_this_record) { std::cerr << "Queries_from_file: fatal error on line " << input.lines_read() << '\n'; return 0; } diff --git a/src/Molecule_Lib/rwsubstructure_proto.cc b/src/Molecule_Lib/rwsubstructure_proto.cc index 6c521e5e..0f13b28f 100644 --- a/src/Molecule_Lib/rwsubstructure_proto.cc +++ b/src/Molecule_Lib/rwsubstructure_proto.cc @@ -2312,6 +2312,18 @@ Single_Substructure_Query::_construct_from_proto(const SubstructureSearch::Singl } } + if (proto.nearby_atoms_size() > 0) { + for (const auto& r : proto.nearby_atoms()) { + std::unique_ptr nearby(std::make_unique()); + if (! nearby->ConstructFromProto(r)) { + cerr << "Single_Substructure_Query::_construct_from_proto:invalid NearbyAtoms\n"; + cerr << r.ShortDebugString() << '\n'; + return 0; + } + _nearby_atoms.add(nearby.release()); + } + } + if (proto.has_sort_matches() > 0) { _sort_matches_by = 0; @@ -4089,6 +4101,108 @@ RequiredMolecularProperties::DiscernAttributesSpecified() { return _attributes_specified; } +int +NearbyAtoms::ConstructFromProto(const SubstructureSearch::NearbyAtoms& proto) { + cerr << "NearbyAtoms::ConstructFromProto building from\n"; + cerr << proto.ShortDebugString() << '\n'; + int nquery = proto.smarts_size() + proto.query_size() + proto.query_file_size(); + if (nquery != 1) { + cerr << "NearbyAtoms::ConstructFromProto:must specify exactly 1 query source " << nquery << " invalid\n"; + return 0; + } + + for (const std::string& smt : proto.smarts()) { + std::unique_ptr q = std::make_unique(); + if (! q->create_from_smarts(smt)) { + cerr << "NearbyAtoms::ConstructFromProto:invalid smarts '" << smt << "'\n"; + return 0; + } + _query << q.release(); + } + + for (const std::string& query_string : proto.query()) { + SubstructureSearch::SubstructureQuery query_proto; + if (!google::protobuf::TextFormat::ParseFromString(query_string, &query_proto)) { + cerr << "NearbyAtoms::ConstructFromProto:cannot parse proto data\n"; + cerr << query_string << '\n'; + return 0; + } + + std::unique_ptr q = std::make_unique(); + if (! q->ConstructFromProto(query_proto)) { + cerr << "NearbyAtoms::ConstructFromProto:invalid query '" << query_string << "'\n"; + return 0; + } + _query << q.release(); + } + + // We do not make allowance for directory path here... + for (const std::string& fname : proto.query_file()) { + IWString tmp(fname); + std::optional maybe_proto = + iwmisc::ReadTextProto(tmp); + if (! maybe_proto) { + cerr << "NearbyAtoms::ConstructFromProto:cannot read '" << fname << "'\n"; + return 0; + } + std::unique_ptr q = std::make_unique(); + if (! q->ConstructFromProto(*maybe_proto)) { + cerr << "NearbyAtoms::ConstructFromProto:Invalid query '" << fname << "'\n"; + return 0; + } + _query << q.release(); + } + + if (proto.has_can_overlap_matched_atoms()) { + _can_overlap_matched_atoms = proto.can_overlap_matched_atoms(); + } + + if (!GETVALUES(proto, hits_needed, 0, no_limit)) { + return 0; + } + + if (! _hits_needed.is_set()) { + _hits_needed.set_min(1); + } + + for (uint32_t a : proto.matched_atom()) { + _matched_atom << a; + } + + if (! GETVALUES(proto, bonds_between, 0, no_limit)) { + return 0; + } + + if (proto.has_rejection()) { + _rejection = proto.rejection(); + } + cerr << "Rejection set to " << _rejection << '\n'; + + return 1; +} + +int +NearbyAtoms::BuildProto(SubstructureSearch::NearbyAtoms& proto) const { + cerr << "NearbyAtoms::BuildProto:queries not implemented\n"; + + SetProtoValues(_hits_needed, "hits_needed", proto); + SetProtoValues(_hits_needed, "bonds_between", proto); + + for (const uint32_t a : _matched_atom) { + proto.add_matched_atom(a); + } + + if (_can_overlap_matched_atoms) { + proto.set_can_overlap_matched_atoms(_can_overlap_matched_atoms); + } + + if (_rejection) { + proto.set_rejection(true); + } + + return 1; +} + namespace iwsubstructure { constexpr char kCloseBrace = '}'; diff --git a/src/Molecule_Lib/smiles.h b/src/Molecule_Lib/smiles.h index 75c25a5b..c741688a 100644 --- a/src/Molecule_Lib/smiles.h +++ b/src/Molecule_Lib/smiles.h @@ -1,6 +1,10 @@ #ifndef MOLECULE_LIB_SMILES_H_ #define MOLECULE_LIB_SMILES_H_ +#include + +#include "Foundational/iwstring/iwstring.h" + #include "molecule.h" /* diff --git a/src/Molecule_Lib/standardise.h b/src/Molecule_Lib/standardise.h index 26768baa..4b4d199f 100644 --- a/src/Molecule_Lib/standardise.h +++ b/src/Molecule_Lib/standardise.h @@ -1,9 +1,8 @@ #ifndef MOLECULE_LIB_STANDARDISE_H_ #define MOLECULE_LIB_STANDARDISE_H_ -/* - For each transformation we keep track of things processed -*/ +// Chemical standardisation. +// Transformations that change one molecular representation to another. #include diff --git a/src/Molecule_Lib/substructure.h b/src/Molecule_Lib/substructure.h index 472286b8..6296df3c 100644 --- a/src/Molecule_Lib/substructure.h +++ b/src/Molecule_Lib/substructure.h @@ -1,21 +1,26 @@ #ifndef MOLECULE_LIB_SUBSTRUCTURE_H_ #define MOLECULE_LIB_SUBSTRUCTURE_H_ +#include #include #include #include +#include +#include #ifdef IW_USE_TBB_SCALABLE_ALLOCATOR #include "tbb/scalable_allocator.h" #endif #include "Foundational/iwaray/iwaray.h" -#include "Foundational/iwmisc/matcher.h" -#include "Foundational/iwmisc/minmaxspc.h" -#include "Foundational/iwmisc/iwminmax.h" #include "Foundational/iwbits/iwbits.h" +#include "Foundational/iwmisc/iwminmax.h" #include "Foundational/iwmisc/logical_expression.h" +#include "Foundational/iwmisc/matcher.h" +#include "Foundational/iwmisc/minmaxspc.h" #include "Foundational/iwmisc/msi_object.h" +#include "Foundational/iwmisc/set_or_unset.h" +#include "Foundational/iwstring/iwstring.h" #include "atom_alias.h" #include "iwmtypes.h" @@ -2536,6 +2541,47 @@ class RequiredMolecularProperties { int Matches(Molecule_to_Match & target_molecule); }; +// Specify that within some distance of a matched atom, there must be +// another query matched. +class NearbyAtoms { + private: + resizable_array_p _query; + + // can the atoms matched here overlap with the matoms matched by the main query. + boolean _can_overlap_matched_atoms; + + // How many instances of this do we require. + Min_Max_Specifier _hits_needed; + + // By default, we measure ourselves relative to any matched atom, but + // if this is set, we measure relative to only some matched atoms. + resizable_array _matched_atom; + + // The constraint on the number of bonds between our matched atom(s) + // and those in the query. + Min_Max_Specifier _bonds_between; + + // By default, we are a positive requirement for a match. We can instead + // be a rejection. + int _rejection; + + // private functions. + int AnyMatchedAtomInRange(Molecule_to_Match& target, + const int* already_matched, const Set_of_Atoms& embedding) const; + int SpecifiedmatchedAtomInRange(Molecule_to_Match& target, const Query_Atoms_Matched& qam, + const Set_of_Atoms& embedding) const; + + public: + NearbyAtoms(); + + int ConstructFromProto(const SubstructureSearch::NearbyAtoms& proto); + int BuildProto(SubstructureSearch::NearbyAtoms& proto) const; + + int Matches(Molecule_to_Match& target, Query_Atoms_Matched& qam, + const int* already_matched); +}; + + /* The process of verifying the internal consistency of a substructure query is somewhat expensive. To avoid recomputing this, we keep @@ -2975,6 +3021,10 @@ class Single_Substructure_Query // May 2023. Regions resizable_array_p _region; + // Oct 2023. + // Groups that are to be found near the matched atoms of the query. + resizable_array_p _nearby_atoms; + // private functions void _default_values(); diff --git a/src/Molecule_Lib/substructure.proto b/src/Molecule_Lib/substructure.proto index c64a5aa5..0975eea2 100644 --- a/src/Molecule_Lib/substructure.proto +++ b/src/Molecule_Lib/substructure.proto @@ -1005,6 +1005,44 @@ message RequiredMolecularProperties { repeated ElementsNeeded elements_needed = 47; } +// The concept of other atoms that must be somewhere near the matched +// atoms. This enables fuzzy concepts like +// a donor within 3 bonds of any matched atom +// an acceptor within [2,4] bonds of matched atom 5 +// note that sometimes the ...{[2,4] } construct will work there. +message NearbyAtoms { + // Specify the query via any of these means. + repeated string smarts = 1; + repeated string query = 2; + repeated string query_file = 3; + + // By default, NearbyAtoms cannot overlap the atoms + // matched by the query. + optional bool can_overlap_matched_atoms = 4; + + // The number of hits needed. All matches must match + // the distance constraints. This could also be specified + // via the `query` or `query_file` construct. + optional uint32 min_hits_needed = 5; + optional uint32 max_hits_needed = 6; + repeated uint32 hits_needed = 7; + + // The matched atom(s) from which we are measured. If this + // is empty, then we check distances with respect to any matched + // atom. + repeated uint32 matched_atom = 8; + + // The constraint on the number of bonds between our matched atom(s) + // and the matched atom(s) of the query. + optional uint32 min_bonds_between = 9; + optional uint32 max_bonds_between = 10; + repeated uint32 bonds_between = 11; + + // Normally the presence of nearby matched atoms is a requirement for + // a match, but it can also be cause for a rejection. + optional bool rejection = 12; +} + message SingleSubstructureQuery { // Must be present, and unique across all SingleSubstructureQuery. optional int32 id = 1; @@ -1228,7 +1266,12 @@ message SingleSubstructureQuery { // Regions defined by matched atoms. repeated Region region = 81; - // Next to assign 82 + // There is some redundancy with SeparatedAtoms and LinkerAtoms + // but they each have different interesting capabilities. + // This is probably the most flexible. + repeated NearbyAtoms nearby_atoms = 82; + + // Next to assign 83 } // A SubstructureQuery is merely a collection of individual diff --git a/src/Molecule_Lib/substructure_nmab.cc b/src/Molecule_Lib/substructure_nmab.cc index be992305..c1be0c39 100644 --- a/src/Molecule_Lib/substructure_nmab.cc +++ b/src/Molecule_Lib/substructure_nmab.cc @@ -1354,3 +1354,111 @@ Region::Matches(Molecule_to_Match& target, return 1; } + +NearbyAtoms::NearbyAtoms() { + _rejection = 0; + _can_overlap_matched_atoms = false; +} + +//#define DEBUG_NEARBY_ATOMS_MATCHES + +int +NearbyAtoms::Matches(Molecule_to_Match& target, Query_Atoms_Matched& qam, + const int* already_matched) { +#ifdef DEBUG_NEARBY_ATOMS_MATCHES + const int matoms = target.natoms(); + Molecule& m = *target.molecule(); + cerr << "NearbyAtoms::Matches " << m.smiles() << '\n'; + for (int i = 0; i < matoms; ++i) { + if (already_matched[i]) { + cerr << " atom " << i << " " << m.smarts_equivalent_for_atom(i) << '\n'; + } + } +#endif // DEBUG_NEARBY_ATOMS_MATCHES + + Substructure_Results sresults; + int got_match = 0; + + for (Substructure_Query* q : _query) { + if (q->substructure_search(target, sresults) == 0) { + continue; + } + + for (const Set_of_Atoms* e : sresults.embeddings()) { +#ifdef DEBUG_NEARBY_ATOMS_MATCHES + cerr << "_can_overlap_matched_atoms " << _can_overlap_matched_atoms << " overlap " << + e->any_members_set_in_array(already_matched) << '\n'; +#endif + if (! _can_overlap_matched_atoms && e->any_members_set_in_array(already_matched)) { + continue; + } + + if (_matched_atom.empty()) { + if (! AnyMatchedAtomInRange(target, already_matched, *e)) { + return 0; + } + } else if (! SpecifiedmatchedAtomInRange(target, qam, *e)) { + return 0; + } + + ++got_match; + } + } + +#ifdef DEBUG_NEARBY_ATOMS_MATCHES + cerr << "Got " << got_match << " mathes to querie, matches " << _hits_needed.matches(got_match) << " rej " << _rejection << '\n'; +#endif + if (_hits_needed.matches(got_match)) { + return ! _rejection; + } + + return _rejection; +} + +int +NearbyAtoms::AnyMatchedAtomInRange(Molecule_to_Match& target, + const int* already_matched, const Set_of_Atoms& embedding) const { + Molecule& m = *target.molecule(); + const int matoms = m.natoms(); + + for (int i = 0; i < matoms; ++i) { + if (! already_matched[i]) { + continue; + } + + for (const atom_number_t& a : embedding) { + const int d = m.bonds_between(i, a); + if (_bonds_between.matches(d)) { + return 1; + } + } + } + + return 0; +} + +int +NearbyAtoms::SpecifiedmatchedAtomInRange(Molecule_to_Match& target, + const Query_Atoms_Matched& qam, + const Set_of_Atoms& embedding) const { + Molecule& m = *target.molecule(); + + for (uint32_t a : _matched_atom) { + if (! qam.ok_index(a)) { + cerr << "NearbyAtoms::SpecifiedmatchedAtomInRange:matched atom " << a << " invalid\n"; + cerr << "Query matches only " << qam.size() << " atoms\n"; + return 0; + } + + const atom_number_t matched = qam[a]->atom_number_matched(); + + for (const atom_number_t e : embedding) { + const int d = m.bonds_between(e, matched); + if (_bonds_between.matches(d)) { + return 1; + } + } + } + + return 0; +} diff --git a/src/Molecule_Lib/substructure_nmab_test.cc b/src/Molecule_Lib/substructure_nmab_test.cc index 49169eda..a8a524dd 100644 --- a/src/Molecule_Lib/substructure_nmab_test.cc +++ b/src/Molecule_Lib/substructure_nmab_test.cc @@ -397,7 +397,9 @@ class TestRegionsP: public testing::TestWithParam { TEST_P (TestRegionsP, Tests) { const auto params = GetParam(); + cerr << "Calling TextFormat\n"; ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString(params.proto, &_proto)); + cerr << "Next ConstructFromProto\n"; ASSERT_TRUE(_query.ConstructFromProto(_proto)); ASSERT_TRUE(_mol.build_from_smiles(params.smiles)); // cerr << "Testing " << params.smiles << " expecting " << params.expected << '\n'; @@ -474,4 +476,269 @@ query { )); +class TestNearbyAtomsP: public testing::TestWithParam { + protected: + SubstructureSearch::SubstructureQuery _proto; + Substructure_Query _query; + Molecule _mol; + Substructure_Results _sresults; +}; + +TEST_P (TestNearbyAtomsP, Tests) { + const auto params = GetParam(); + cerr << "Calling TextFormat\n"; + ASSERT_TRUE(google::protobuf::TextFormat::ParseFromString(params.proto, &_proto)); + cerr << "Next ConstructFromProto\n"; + ASSERT_TRUE(_query.ConstructFromProto(_proto)); + ASSERT_TRUE(_mol.build_from_smiles(params.smiles)); + // cerr << "Testing " << params.smiles << " expecting " << params.expected << '\n'; + EXPECT_EQ(_query.substructure_search(_mol, _sresults), params.expected) << + "mismatch " << params.smiles << " from " << _proto.ShortDebugString() << '\n'; +} +INSTANTIATE_TEST_SUITE_P(TestNearbyAtomsP, TestNearbyAtomsP, testing::Values( + + ProtoMolMatches{R"pb( +query { + smarts: "O" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + min_bonds_between: 2 + max_bonds_between: 4 + } +} +)pb", "OCCN", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "O" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + min_bonds_between: 3 + max_bonds_between: 4 + } +} +)pb", "OCCN", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "O" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + min_bonds_between: 4 + max_bonds_between: 5 + } +} +)pb", "OCCN", 0}, + + ProtoMolMatches{R"pb( +query { + smarts: "n1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + min_bonds_between: 2 + max_bonds_between: 3 + matched_atom: 0 + } +} +)pb", "n1c(CN)cccc1", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "n1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + bonds_between: 2 + matched_atom: 0 + } +} +)pb", "n1c(CN)cccc1", 0}, + + ProtoMolMatches{R"pb( +query { + smarts: "n1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + bonds_between: 3 + matched_atom: 0 + } +} +)pb", "n1c(CN)cccc1", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "n1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + bonds_between: 3 + matched_atom: 0 + hits_needed: 1 + } +} +)pb", "n1c(CN)cccc1", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "n1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + bonds_between: 3 + matched_atom: 0 + hits_needed: 2 + } +} +)pb", "n1c(CN)cccc1", 0}, + + ProtoMolMatches{R"pb( +query { + smarts: "n1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + bonds_between: 3 + matched_atom: 0 + min_hits_needed: 1 + } +} +)pb", "n1c(CN)cccc1", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "n1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + bonds_between: 3 + matched_atom: 0 + min_hits_needed: 1 + rejection: true + } +} +)pb", "n1c(CN)cccc1", 0}, + + ProtoMolMatches{R"pb( +query { + smarts: "Fc1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "F" + bonds_between: 1 + can_overlap_matched_atoms: false + } +} +)pb", "Fc1ccccc1", 0}, + + ProtoMolMatches{R"pb( +query { + smarts: "Fc1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "F" + bonds_between: 1 + can_overlap_matched_atoms: true + } +} +)pb", "Fc1ccccc1", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "Fc1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + max_bonds_between: 2 + matched_atom: [3, 4, 5] + } +} +)pb", "Fc1ccccc1", 0}, + + ProtoMolMatches{R"pb( +query { + smarts: "Fc1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + max_bonds_between: 2 + matched_atom: [3, 4, 5] + } +} +)pb", "Fc1cc(N)ccc1", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "Fc1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + max_bonds_between: 2 + matched_atom: [3, 4, 5] + } +} +)pb", "Fc1cc(CN)ccc1", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "Fc1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + max_bonds_between: 2 + matched_atom: [3, 4, 5] + } +} +)pb", "Fc1cc(CCN)ccc1", 0}, + + ProtoMolMatches{R"pb( +query { + smarts: "Fc1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + max_bonds_between: 2 + matched_atom: [3, 4, 5] + min_hits_needed: 2 + } +} +)pb", "Fc1cc(CN)cc(CN)c1", 1}, + + ProtoMolMatches{R"pb( +query { + smarts: "Fc1ccccc1" + unique_embeddings_only: true + nearby_atoms { + smarts: "N" + max_bonds_between: 2 + matched_atom: [3, 4, 5] + min_hits_needed: 2 + max_hits_needed: 2 + } +} +)pb", "Fc1cc(CN)c(N)c(CN)c1", 0}, + + // Wow, look at what this can do. + // Can specify that some number of the matched atoms must be a given type. + // We always had element_hits_needed, but this seems more precise. + ProtoMolMatches{R"pb( +query { + smarts: "Fc1caaac1" + unique_embeddings_only: true + nearby_atoms { + smarts: "n" + max_bonds_between: 0 + matched_atom: [3, 4, 5] + hits_needed: 2 + can_overlap_matched_atoms: true + } +} +)pb", "Fc1cncnc1", 1} + +)); + } // namespace diff --git a/src/Molecule_Lib/substructure_spec.cc b/src/Molecule_Lib/substructure_spec.cc index 8476bdfc..2df441b4 100644 --- a/src/Molecule_Lib/substructure_spec.cc +++ b/src/Molecule_Lib/substructure_spec.cc @@ -1717,6 +1717,31 @@ truncate_after_digits(const const_IWSubstring & ignore_these, return; // looked good all the way out } +// `token` is part of a {number} pattern. The opening brace has been +// removed. Return true if we find a closing brace and the characters +// before that are a value number, placed in `result`. +static int +FetchNumericFromBraces(const const_IWSubstring& token, Set_or_Unset& result) { + int cbrace = token.index(kCloseBrace); + if (cbrace < 0) { + cerr << "FetchNumericFromBraces:no closing brace in '" << token << "'\n"; + return 0; + } + + IWString mytoken(token); + mytoken.iwtruncate(cbrace); + mytoken.gsub('_', '.'); + + double tmp; + if (mytoken.numeric_value(tmp)) { + result.set(tmp); + return 1; + } + + cerr << "FetchNumericFromBraces:invalid numeric '" << token << "'\n"; + return 0; +} + //#define DEBUG_ATOM_CONSTRUCT_FROM_SMARTS_TOKEN /* @@ -1960,7 +1985,14 @@ Substructure_Atom::construct_from_smarts_token(const const_IWSubstring & smarts) ; else if (c.starts_with("cipR") || c.starts_with("cipS")) ; - else if (c.starts_with("Nv")) + else if (c.starts_with("Nv{")) { + c.remove_leading_chars(3); + if (! FetchNumericFromBraces(c, _numeric_value)) { + cerr << "Substructure_Atom::construct_from_smarts_token:invalid Nv '" << c << "'\n"; + return 0; + } + } + else if (c.starts_with("Nv")) // positive integers only { c.remove_leading_chars(2); int nv; @@ -2987,6 +3019,17 @@ Substructure_Atom_Specifier::construct_from_smarts_token(const const_IWSubstring } nchars = 3 + 4 + c.length() - 1; } + else if (c.starts_with("Nv{")) { + c.remove_leading_chars(3); + nchars = 3 + 3; + while (c.length()) { + if (c[0] == kCloseBrace) { + break; + } + c += 1; + ++nchars; + } + } else if (c.starts_with("Nv")) { c.remove_leading_chars(2); diff --git a/src/Molecule_Lib/temp_detach_atoms.h b/src/Molecule_Lib/temp_detach_atoms.h index 6f9a4d6f..2f1efa91 100644 --- a/src/Molecule_Lib/temp_detach_atoms.h +++ b/src/Molecule_Lib/temp_detach_atoms.h @@ -7,6 +7,10 @@ Hydrogens in order for the queries to work */ + +#include "Foundational/iwaray/iwaray.h" +#include "Foundational/iwstring/iwstring.h" + #include "molecule.h" class Temp_Detach_Atoms { diff --git a/src/Molecule_Tools/BUILD b/src/Molecule_Tools/BUILD index b6d52469..e24107d9 100644 --- a/src/Molecule_Tools/BUILD +++ b/src/Molecule_Tools/BUILD @@ -1,4 +1,5 @@ load("@rules_proto//proto:defs.bzl", "proto_library") +load("@com_google_protobuf//:protobuf.bzl", "py_proto_library") load("//build_deps:install.bzl", "local_install") local_install( @@ -9,7 +10,6 @@ local_install( ":activity_consistency", ":align_molecule", ":atom_triples", - ":buildsmidb_bdb", ":chirality_fingerprint", ":common_names", ":dbf", @@ -27,13 +27,9 @@ local_install( ":grid_fingerprint", ":hydrophobic_sections", ":id_chirality", - ":in_database_bdb", - ":in_lilly_database_bdb", ":iwdemerit", ":iwdescr", ":iwecfp", - ":iwecfp_database_load", - ":iwecfp_database_lookup", ":iwecfp_intermolecular", ":iwfp", ":iwpathd", @@ -91,10 +87,8 @@ local_install( ":rxn_standardize", ":rxn_substructure_search", ":same_structures", - ":smi2rings_bdb", ":smiles_mutation", ":sp3_filter", - ":substituent_identification", ":substituent_model", ":substitutions", ":substructure_match_fraction", @@ -186,6 +180,13 @@ cc_proto_library( ], ) +py_proto_library( + name = "dicer_fragments_py_proto", + srcs = [ + "dicer_fragments.proto", + ], +) + proto_library( name = "iwdescr_proto", srcs = [ @@ -338,20 +339,22 @@ cc_proto_library( ], ) - -proto_library( - name = "smi2rings_proto", - srcs = [ - "smi2rings.proto", - ], -) - -cc_proto_library( - name = "smi2rings_cc_proto", - deps = [ - "smi2rings_proto", - ], -) +# proto_library( +# name = "tsubstructure_proto", +# srcs = [ +# "tsubstructure.proto", +# ], +# deps = [ +# "//Molecule_Lib:substructure_proto", +# ], +# ) +# +# cc_proto_library( +# name = "tsubstructure_cc_proto", +# deps = [ +# "tsubstructure_proto", +# ], +# ) proto_library( name = "xlogp_proto", @@ -453,22 +456,6 @@ cc_binary( ], ) -cc_binary( - name = "buildsmidb_bdb", - srcs = [ - "buildsmidb_bdb.cc", - ], - tags = ["berkeleydb"], - deps = [ - ":storage_conditions", - "//Foundational/cmdline:iwcmdline", - "//Molecule_Lib:iwmolecule", - "//Molecule_Lib:moleculeio", - "@berkeleydb", - "@com_google_protobuf//:protobuf", - ], -) - cc_binary( name = "chirality_fingerprint", srcs = [ @@ -540,21 +527,6 @@ cc_binary( ], ) -cc_binary( - name = "dicer_fragment_lookup_bdb", - srcs = [ - "dicer_fragment_lookup_bdb.cc", - ], - deps = [ - "dicer_fragments_cc_proto", - "//Foundational/cmdline:iwcmdline", - "//Foundational/data_source:iwstring_data_source", - "//Molecule_Lib:iwmolecule", - "@berkeleydb", - "@com_google_protobuf//:protobuf", - ], -) - cc_binary( name = "dicer_fragment_overlap", srcs = [ @@ -819,36 +791,6 @@ cc_binary( ], ) -cc_binary( - name = "in_database_bdb", - srcs = [ - "in_database_bdb.cc", - ], - tags = ["berkeleydb"], - deps = [ - ":storage_conditions", - "//Foundational/cmdline:iwcmdline", - "//Molecule_Lib:iwmolecule", - "//Molecule_Lib:iwreaction", - "//Molecule_Lib:moleculeio", - "@berkeleydb", - ], -) -cc_binary( - name = "in_lilly_database_bdb", - srcs = [ - "in_lilly_database_bdb.cc", - ], - tags = ["berkeleydb"], - deps = [ - ":storage_conditions", - "//Foundational/cmdline:iwcmdline", - "//Molecule_Lib:iwmolecule", - "//Molecule_Lib:moleculeio", - "@berkeleydb", - ], -) - cc_binary( name = "iwdemerit", srcs = [ @@ -910,35 +852,6 @@ cc_binary( ], ) -cc_binary( - name = "iwecfp_database_load", - srcs = [ - "iwecfp_database_load.cc", - ], - deps = [ - ":iwecfp_database", - "//Foundational/cmdline:iwcmdline", - "//Foundational/iwmisc", - "//Molecule_Lib:iwmolecule", - "//Molecule_Lib:moleculeio", - "@berkeleydb", - ], -) - -cc_binary( - name = "iwecfp_database_lookup", - srcs = [ - "iwecfp_database_lookup.cc", - ], - deps = [ - ":iwecfp_database", - "//Foundational/cmdline:iwcmdline", - "//Molecule_Lib:iwmolecule", - "//Molecule_Lib:moleculeio", - "@berkeleydb", - ], -) - cc_binary( name = "iwecfp_intermolecular", srcs = [ @@ -1843,21 +1756,6 @@ cc_binary( "//Molecule_Lib:moleculeio", ], ) - -cc_binary( - name = "substituent_identification", - srcs = [ - "substituent_identification.cc", - ], - tags = ["berkeleydb"], - deps = [ - "//Foundational/cmdline:iwcmdline", - "//Foundational/iwmisc", - "//Molecule_Lib:iwmolecule", - "//Molecule_Lib:moleculeio", - "@berkeleydb", - ], -) cc_binary( name = "substituent_model", srcs = [ @@ -1884,21 +1782,6 @@ cc_binary( ], ) -cc_library( - name = "iwecfp_database", - srcs = [ - "iwecfp_database.cc", - ], - hdrs = [ - "iwecfp_database.h", - ], - deps = [ - "//Foundational/cmdline:iwcmdline", - "//Molecule_Lib:iwmolecule", - "@berkeleydb", - ], -) - cc_library( name = "spatially_common_matched_atoms", srcs = [ @@ -2277,21 +2160,6 @@ cc_binary( ], ) -cc_library( - name = "storage_conditions", - srcs = [ - "storage_conditions.cc", - ], - hdrs = [ - "storage_conditions.h", - ], - deps = [ - "//Foundational/cmdline:iwcmdline", - "//Molecule_Lib:iwmolecule", - "@berkeleydb", - ], -) - cc_binary( name = "r1r2etc", srcs = [ @@ -2419,22 +2287,6 @@ cc_binary( ], ) -cc_binary( - name = "smi2rings_bdb", - srcs = [ - "smi2rings_bdb.cc", - ], - tags = ["berkeleydb"], - deps = [ - ":smi2rings_cc_proto", - "//Foundational/cmdline:iwcmdline", - "//Foundational/iwmisc", - "//Molecule_Lib:iwmolecule", - "//Molecule_Lib:moleculeio", - "@berkeleydb", - ], -) - cc_binary( name = "substructure_match_fraction", srcs = [ @@ -2835,22 +2687,22 @@ cc_library( # ], #) -# cc_library( -# name = "unique_molecules_api", -# srcs = [ -# "unique_molecules_api.cc", -# ], -# hdrs = [ -# "unique_molecules_api.h", -# ], -# deps = [ -# "//Molecule_Lib:iwmolecule", -# "@com_google_absl//absl/container:btree", -# ], -# visibility = [ -# "//visibility:public", -# ], -# ) +cc_library( + name = "unique_molecules_api", + srcs = [ + "unique_molecules_api.cc", + ], + hdrs = [ + "unique_molecules_api.h", + ], + deps = [ + "//Molecule_Lib:iwmolecule", + "@com_google_absl//absl/container:btree", + ], + visibility = [ + "//visibility:public", + ], +) cc_library( name = "xlogp_lib", diff --git a/src/Molecule_Tools/maccskeys_fn5.cc b/src/Molecule_Tools/maccskeys_fn5.cc index adf32e07..853ffc7b 100644 --- a/src/Molecule_Tools/maccskeys_fn5.cc +++ b/src/Molecule_Tools/maccskeys_fn5.cc @@ -2556,6 +2556,9 @@ MACCSKeys::_key34 (Molecule & m, const int * aromatic = mpr.aromatic(); const int matoms = mpr.natoms(); + if (matoms == 1) { + return 0; + } int rc = 0; diff --git a/src/Molecule_Tools/marvin_pka.cc b/src/Molecule_Tools/marvin_pka.cc index 4a8b21b9..2712c552 100644 --- a/src/Molecule_Tools/marvin_pka.cc +++ b/src/Molecule_Tools/marvin_pka.cc @@ -151,7 +151,6 @@ CXResult::Build(const const_IWSubstring& buffer, return 0; } atoms[atom[ndx]] = (atom_number - 1); - cerr << "ndx " << ndx << " is atom " << atoms[atom[ndx]] << '\n'; } } } diff --git a/src/Molecule_Tools/ring_extraction.cc b/src/Molecule_Tools/ring_extraction.cc index 3d5bef89..4dab89b2 100644 --- a/src/Molecule_Tools/ring_extraction.cc +++ b/src/Molecule_Tools/ring_extraction.cc @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -11,6 +12,7 @@ #include "google/protobuf/text_format.h" +#define RESIZABLE_ARRAY_IWQSORT_IMPLEMENTATION #define RESIZABLE_ARRAY_IMPLEMENTATION #define IWQSORT_FO_IMPLEMENTATION @@ -1235,14 +1237,49 @@ ExtractRings::WriteRings(IWString& fname, } // Write a set of rings `rings` to `output` as text_proto form. +// Optionally sort them. int ExtractRings::WriteRings(IWString_and_File_Descriptor& output, const IW_STL_Hash_Map& rings) const { static google::protobuf::TextFormat::Printer printer; printer.SetSingleLineMode(true); + resizable_array for_sorting; + for_sorting.resize(rings.size()); + for (const auto& [_, r] : rings) { + for_sorting << &r; + } + + // Sort by number of exemplars, and secondarily by the unique smiles + // in order to generate a canonical order, which helps unit tests. + for_sorting.iwqsort_lambda([](const RplRing::ReplacementRing* r1, + const RplRing::ReplacementRing* r2) { + if (r1->n() > r2->n()) { + return -1; + } else if (r1->n() < r2->n()) { + return 1; + } + const std::string& usmi1 = r1->usmi(); + const std::string& usmi2 = r2->usmi(); + if (usmi1.size() < usmi2.size()) { + return -1; + } else if (usmi1.size() > usmi2.size()) { + return 1; + } + + return std::strncmp(usmi1.data(), usmi2.data(), usmi1.size()); + } + ); + std::string buffer; + for (const RplRing::ReplacementRing* r : for_sorting) { + printer.PrintToString(*r, &buffer); + output << buffer << '\n'; + output.write_if_buffer_holds_more_than(8192); + } + return 1; + for (const auto& [usmi, r] : rings) { printer.PrintToString(r, &buffer); output << buffer << '\n'; diff --git a/src/Molecule_Tools/tp1_summarise.cc b/src/Molecule_Tools/tp1_summarise.cc index d6475927..f0a27352 100644 --- a/src/Molecule_Tools/tp1_summarise.cc +++ b/src/Molecule_Tools/tp1_summarise.cc @@ -760,6 +760,7 @@ write_reasons (const IW_STL_Hash_Map_int & reason_bad, for (int i = 0; i < istop; ++i) { write_rejection_reason(rej, i, output); + output << ' '; write_rejection_reason(dem, i, output); output << '\n'; } diff --git a/src/Molecule_Tools/trxn.cc b/src/Molecule_Tools/trxn.cc index a89a4ecb..4b627f2d 100644 --- a/src/Molecule_Tools/trxn.cc +++ b/src/Molecule_Tools/trxn.cc @@ -38,6 +38,8 @@ static int verbose = 0; static int molecules_processed = 0; +static int products_written = 0; + static Number_Assigner number_assigner; static Chemical_Standardisation chemical_standardisation; @@ -62,6 +64,17 @@ static int max_atoms_in_product = 0; static int products_discarded_for_too_many_atoms = 0; +// Oct 2023. It is common to generate molecules that might +// have fragments that are too large or too small. These can +// be complex to filter out with other tools, so enable someone +// to specify the min and max fragment size in the product. +// Any product violating this is discarded. + +static int need_to_check_product_fragment_sizes = 0; +static int min_allowed_fragment_size_in_product = 0; +static int max_allowed_fragment_size_in_product = std::numeric_limits::max(); +static int products_discarded_for_violating_fragment_specifications = 0; + /* There are subtle differences between these two directives. make_implicit_hydrogens_explicit is more about the reaction and the scaffold @@ -209,9 +222,9 @@ usage(int rc) { cerr << " -d suppress duplicate molecules - only checks current molecule\n"; cerr << " -k don't perceive symmetry equivalents in the scaffold\n"; cerr << " -J ... various special purpose options, enter '-J help' for details\n"; - cerr << " -E ... standard element options, enter '-E help' for info\n"; cerr << " -S create output files with name stem \n"; cerr << " -o specify output file type(s)\n"; + cerr << " -E ... standard element options, enter '-E help' for info\n"; (void) display_standard_aromaticity_options(cerr); (void) display_standard_chemical_standardisation_options(cerr, 'g'); cerr << " -i specify input file type\n"; @@ -405,6 +418,27 @@ RemoveHydrogensCausingValenceErrors(Molecule& m) { return 1; } +static int +OkFragmentsInProduct(Molecule& m) { + const int nfrag = m.number_fragments(); + // It is unclear what should happen in this case. + if (nfrag == 1) { + return 1; + } + + for (int i = 0; i < nfrag; ++i) { + const int nat = m.atoms_in_fragment(i); + if (nat < min_allowed_fragment_size_in_product) { + return 0; + } + if (nat > max_allowed_fragment_size_in_product) { + return 0; + } + } + + return 1; +} + static int do_write(Molecule_and_Embedding* sidechain, Molecule& product, int nhits, Molecule_Output_Object& output) { @@ -474,10 +508,19 @@ do_write(Molecule_and_Embedding* sidechain, Molecule& product, int nhits, return 1; } + if (unset_unnecessary_implicit_hydrogens_known_values) { product.unset_unnecessary_implicit_hydrogens_known_values(); } + if (need_to_check_product_fragment_sizes) { + if (! OkFragmentsInProduct(product)) { + ++products_discarded_for_violating_fragment_specifications; + return 1; + } + } + + if (number_assigner.active()) { number_assigner.process(product); } @@ -491,6 +534,8 @@ do_write(Molecule_and_Embedding* sidechain, Molecule& product, int nhits, cerr << "Writing " << product.name() << '\n'; } + ++products_written; + return output.write(product); } @@ -578,7 +623,7 @@ do_all_scaffold_possibilities_enumeration(Molecule& scaffold, IWReaction& reacti static void set_molecule_name(Molecule& m, const IWString& name_stem, int& ndx) { - if (0 == name_stem.length()) { + if (name_stem.empty()) { return; } @@ -1081,14 +1126,14 @@ static int do_write(IW_TDT& tdt, Molecule& result, std::ostream& output) { tdt.set_dataitem_value(SMILES_TAG, result.smiles()); - if (0 == append_to_changed_molecules.length()) { + if (append_to_changed_molecules.empty()) { output << tdt; return output.good(); } if (tdt.index_of_dataitem(identifier_tag) < 0) { - if (0 == append_to_changed_molecules.length()) { + if (append_to_changed_molecules.empty()) { tdt.set_dataitem_value(identifier_tag, result.name()); } else { IWString tmp(result.name()); @@ -1328,27 +1373,31 @@ trxn(const char* fname, IWReaction& rxn, FileType input_type, static void display_dash_j_qualifiers(std::ostream& os) { // clang-format off - os << " -J wrscaf write scaffolds to the output stream\n"; - os << " -J wrsdch write sidechains to the output stream\n"; - os << " -J blki bonds lose Kekule identity\n"; - os << " -J appinfo append text info from reagents to products\n"; - os << " -J onlyreact=RX only react molecules where the name matches RX\n"; - os << " -J maxat=nn discard any product molecule having more than atoms\n"; - os << " -J rmncm ignore multiple substructure matches involving non changing atoms\n"; - os << " -J rmovm ignore multiple substructure matches involving changing atoms\n"; - os << " -J exph make implicit Hydrogen atoms explicit (changes reaction)\n"; - os << " -J exphR make implicit Hydrogen atoms explicit on reagents (reaction not changed)\n"; - os << " -J rmph remove explicit hydrogen atoms from product molecules\n"; - os << " -J rcksm when multiple scaffold hits present, re-check matches for activity\n"; - os << " -J numok keep non-unique embeddings - default is unique embeddings only\n"; - os << " -J isonum isotopically label atoms with their initial atom number\n"; - os << " -J msm= text designating multiple scaffold matches, use NONE to skip\n"; - os << " -J marvin the input reaction file (-D) has come from Marvin\n"; - os << " -J keepatmn retain any atom map numbers in output molecules\n"; - os << " -J larf in smirks, if an atom is lost, remove the fragment\n"; - os << " -J rmhsqb remove unnecessary [] in product molecules\n"; - os << " -J rmxhbv remove explicit hydrogens causing bad valences\n"; - os << " -J coords include coordinates with smiles output\n"; + os << R"( + -J wrscaf write scaffolds to the output stream + -J wrsdch write sidechains to the output stream + -J blki bonds lose Kekule identity + -J appinfo append text info from reagents to products + -J onlyreact=RX only react molecules where the name matches RX + -J maxat=nn discard any product molecule having more than atoms + -J rmncm ignore multiple substructure matches involving non changing atoms + -J rmovm ignore multiple substructure matches involving changing atoms + -J exph make implicit Hydrogen atoms explicit (changes reaction) + -J exphR make implicit Hydrogen atoms explicit on reagents (reaction not changed) + -J rmph remove explicit hydrogen atoms from product molecules + -J rcksm when multiple scaffold hits present, re-check matches for activity + -J numok keep non-unique embeddings - default is unique embeddings only + -J isonum isotopically label atoms with their initial atom number + -J msm= text designating multiple scaffold matches, use NONE to skip + -J marvin the input reaction file (-D) has come from Marvin + -J keepatmn retain any atom map numbers in output molecules + -J larf in smirks, if an atom is lost, remove the fragment + -J rmhsqb remove unnecessary [] in product molecules + -J rmxhbv remove explicit hydrogens causing bad valences + -J coords include coordinates with smiles output + -J minpfs= discard products with a fragment with < minpfs atoms + -J maxpfs= discard products with a fragment with > maxpfs atoms +)"; // clang-format on return; @@ -1447,7 +1496,7 @@ trxn(int argc, char** argv) { } } - if (0 == append_to_changed_molecules.length()) { + if (append_to_changed_molecules.empty()) { cerr << "No text to append specified (-C option)\n"; usage(6); } @@ -1659,6 +1708,28 @@ trxn(int argc, char** argv) { } } else if (j == "coords") { set_append_coordinates_after_each_atom(1); + } else if (j.starts_with("minpfs=")) { + j.remove_leading_chars(7); + if (! j.numeric_value(min_allowed_fragment_size_in_product) || + min_allowed_fragment_size_in_product < 1) { + cerr << "The min fragment size in product molecule directive 'minpfs=' must be a while +ve number\n"; + return 1; + } + if (verbose) { + cerr << "Will discard molecules where any fragment has less than " << min_allowed_fragment_size_in_product << " atoms\n"; + } + need_to_check_product_fragment_sizes = 1; + } else if (j.starts_with("maxpfs=")) { + j.remove_leading_chars(7); + if (! j.numeric_value(max_allowed_fragment_size_in_product) || + max_allowed_fragment_size_in_product < min_allowed_fragment_size_in_product) { + cerr << "The max fragment size in product molecule directive 'maxpfs=' must be a whole +ve number\n"; + return 1; + } + if (verbose) { + cerr << "Will discard molecules where any fragment has more than " << max_allowed_fragment_size_in_product << " atoms\n"; + } + need_to_check_product_fragment_sizes = 1; } else { cerr << "Unrecognised -J qualifier '" << j << "'\n"; display_dash_j_qualifiers(cerr); @@ -2172,9 +2243,16 @@ trxn(int argc, char** argv) { chemical_standardisation.report(cerr); } + if (need_to_check_product_fragment_sizes) { + cerr << products_discarded_for_violating_fragment_specifications << + " product molecules violated for fragment size constraints\n"; + } + if (suppress_duplicate_molecules) { cerr << duplicate_molecules_suppressed << " duplicate products suppressed\n"; } + + cerr << products_written << " products written\n"; } if (nullptr != secondary_reactions) { diff --git a/src/Molecule_Tools/unique_molecules_api.cc b/src/Molecule_Tools/unique_molecules_api.cc new file mode 100644 index 00000000..b2dc2471 --- /dev/null +++ b/src/Molecule_Tools/unique_molecules_api.cc @@ -0,0 +1,131 @@ +#include "unique_molecules_api.h" + +namespace unique_molecules { +UniqueMolecules::UniqueMolecules() { + _exclude_chiral_info = 0; + _exclude_cis_trans_bonding_info = 1; + _strip_to_largest_fragment = 0; + _ignore_isotopes = 0; + _constant_isotope = 0; + + _use_atom_hash = 1; + + _molecules_processed = 0; + _duplicates_found = 0; +} + +void +UniqueMolecules::AddToHashes(const Molecule& m) { + InternalIsUnique(Molecule(m)); +} + +bool +UniqueMolecules::IsUnique(const Molecule& m) { + ++_molecules_processed; + + // Create copy that may be altered. + if (InternalIsUnique(Molecule(m))) { + return true; + } + + ++_duplicates_found; + return false; +} + +bool +UniqueMolecules::InternalIsUnique(Molecule&& m) { + if (_strip_to_largest_fragment) { + m.reduce_to_largest_fragment_carefully(); + } + if (_exclude_chiral_info) { + m.remove_all_chiral_centres(); + } + if (_exclude_cis_trans_bonding_info) { + m.revert_all_directional_bonds_to_non_directional(); + } + if (_ignore_isotopes) { + m.unset_isotopes(); + } + if (_etrans.active()) { + _etrans.process(m); + } + if (_constant_isotope) { + } + + return InternalIsUniqueInner(m); +} + +bool +UniqueMolecules::InternalIsUniqueInner(Molecule& m) { + + IWString usmi; + + if (_mol2graph.active()) { + IWString formula = m.molecular_formula(); + + m.change_to_graph_form(); + + usmi = m.unique_smiles(); + + usmi << ':' << formula; + } else { + usmi = m.unique_smiles(); + } + + std::string usmi_string(usmi.data(), usmi.size()); + + //cerr << "Testing unique smiles '" << usmi << "'\n"; + + const int matoms = m.natoms(); + + while (matoms >= _smiles_hash.number_elements()) + { + _smiles_hash.add(new absl::flat_hash_set); + if (_use_atom_hash) + _atom_hash.add(new std::unordered_set()); + } + + //cerr << matoms << " smiles_hash " << _smiles_hash.number_elements() << " formula_hash " << formula_hash.number_elements() << endl; + + if (_use_atom_hash) { + const uint64_t h = m.quick_bond_hash(); + + std::unordered_set* ha = _atom_hash[matoms]; + + const auto f = ha->find(h); + + if (f == ha->end()) { // new + ha->insert(h); + + absl::flat_hash_set * h = _smiles_hash[matoms]; + h->emplace(std::move(usmi_string)); + + return true; + } + } + + absl::flat_hash_set& h = *_smiles_hash[matoms]; + + auto iter = h.find(usmi_string); + + if (iter == h.end()) { + h.emplace(std::move(usmi_string)); + return true; + } + + return false; +} + +int +UniqueMolecules::Report(std::ostream& output) const { + uint32_t tot = 0; + for (const auto * s : _smiles_hash) { + tot += s->size(); + } + output << "UniqueMolecules:hash contains " << _smiles_hash.size() << " atom counts with " << tot << " unique smiles\n"; + output << _molecules_processed << " molecules " << _duplicates_found << " duplicates " << (_molecules_processed - _duplicates_found) << " unique structures\n"; + + return 1; +} + +} // namespace unique_molecules diff --git a/src/Molecule_Tools/unique_molecules_api.h b/src/Molecule_Tools/unique_molecules_api.h new file mode 100644 index 00000000..69529eb9 --- /dev/null +++ b/src/Molecule_Tools/unique_molecules_api.h @@ -0,0 +1,86 @@ +#ifndef MOLECULE_TOOLS_UNIQUE_MOLECULES_H_ +#define MOLECULE_TOOLS_UNIQUE_MOLECULES_H_ + +// This was initially built as a demo for the python api. +// And while it does work, it is significantly slower than using a set() in +// python! Not sure I understand that... + +#include +#include +#include +#include "absl/container/btree_set.h" +#include "absl/container/flat_hash_set.h" + +#include "Foundational/iwstring/iw_stl_hash_set.h" +#include "Molecule_Lib/molecule.h" +#include "Molecule_Lib/etrans.h" + +namespace unique_molecules { + +class UniqueMolecules { + private: + int _exclude_chiral_info; + int _exclude_cis_trans_bonding_info; + int _strip_to_largest_fragment; + int _ignore_isotopes; + isotope_t _constant_isotope; + + Mol2Graph _mol2graph; + + Element_Transformations _etrans; + + //resizable_array_p _smiles_hash; + resizable_array_p> _smiles_hash; + + int _use_atom_hash; + resizable_array_p> _atom_hash; + + uint32_t _molecules_processed; + uint32_t _duplicates_found; + + // Private functions. + + bool InternalIsUnique(Molecule&& m); + bool InternalIsUniqueInner(Molecule& m); + + public: + UniqueMolecules(); + + // Setters for matching conditions. + void set_exclude_chiral_info(int s) { + _exclude_chiral_info = s; + } + void set_exclude_cis_trans_bonding_info(int s) { + _exclude_cis_trans_bonding_info = s; + } + void set_strip_to_largest_fragment(int s) { + _strip_to_largest_fragment = s; + } + void set_ignore_isotopes(int s) { + _ignore_isotopes = s; + } + void set_constant_isotope(isotope_t s) { + _constant_isotope = s; + } + // Fully expose these so they can be initialised externally. + Mol2Graph& graph_specifications() { + return _mol2graph; + } + Element_Transformations& element_transformations() { + return _etrans; + } + + // For pre-populating the hashes. Does not update the counters. + void AddToHashes(const Molecule& m); + + // True if `m` has not been seen before. + // Note that `m` is not changed, internally a copy is made, + // and any transformations applied to the copy. + bool IsUnique(const Molecule& m); + + int Report(std::ostream& output) const; +}; + +} // namespace unique_molecules + +#endif // MOLECULE_TOOLS_UNIQUE_MOLECULES_H_ diff --git a/src/Molecule_Tools/xlogp_main.cc b/src/Molecule_Tools/xlogp_main.cc index e43864d1..fe8435a0 100644 --- a/src/Molecule_Tools/xlogp_main.cc +++ b/src/Molecule_Tools/xlogp_main.cc @@ -226,7 +226,7 @@ Options::Preprocess(Molecule& m) { return 1; } -int +void AppendSpaceSuppressedName(const IWString& name, IWString_and_File_Descriptor& output) { for (char c : name) { diff --git a/src/Molecule_Tools_Bdb/BUILD b/src/Molecule_Tools_Bdb/BUILD new file mode 100644 index 00000000..43ce0002 --- /dev/null +++ b/src/Molecule_Tools_Bdb/BUILD @@ -0,0 +1,187 @@ +load("@rules_proto//proto:defs.bzl", "proto_library") +load("@com_google_protobuf//:protobuf.bzl", "py_proto_library") +load("//build_deps:install.bzl", "local_install") + +local_install( + name = "install", + srcs = [ + ":buildsmidb_bdb", + ":in_database_bdb", + ":in_lilly_database_bdb", + ":iwecfp_database_load", + ":iwecfp_database_lookup", + ":smi2rings_bdb", + ":substituent_identification", + ], +) + + +proto_library( + name = "smi2rings_proto", + srcs = [ + "smi2rings.proto", + ], +) + +cc_proto_library( + name = "smi2rings_cc_proto", + deps = [ + "smi2rings_proto", + ], +) + +cc_binary( + name = "buildsmidb_bdb", + srcs = [ + "buildsmidb_bdb.cc", + ], + tags = ["berkeleydb"], + deps = [ + ":storage_conditions", + "//Foundational/cmdline:iwcmdline", + "//Molecule_Lib:iwmolecule", + "//Molecule_Lib:moleculeio", + "@berkeleydb", + "@com_google_protobuf//:protobuf", + ], +) + +cc_binary( + name = "dicer_fragment_lookup_bdb", + srcs = [ + "dicer_fragment_lookup_bdb.cc", + ], + tags = ["berkeleydb"], + deps = [ + "//Foundational/cmdline:iwcmdline", + "//Foundational/data_source:iwstring_data_source", + "//Molecule_Lib:iwmolecule", + "//Molecule_Tools:dicer_fragments_cc_proto", + "@berkeleydb", + "@com_google_protobuf//:protobuf", + ], +) + +cc_binary( + name = "in_database_bdb", + srcs = [ + "in_database_bdb.cc", + ], + tags = ["berkeleydb"], + deps = [ + ":storage_conditions", + "//Foundational/cmdline:iwcmdline", + "//Molecule_Lib:iwmolecule", + "//Molecule_Lib:iwreaction", + "//Molecule_Lib:moleculeio", + "@berkeleydb", + ], +) +cc_binary( + name = "in_lilly_database_bdb", + srcs = [ + "in_lilly_database_bdb.cc", + ], + tags = ["berkeleydb"], + deps = [ + ":storage_conditions", + "//Foundational/cmdline:iwcmdline", + "//Molecule_Lib:iwmolecule", + "//Molecule_Lib:moleculeio", + "@berkeleydb", + ], +) + +cc_binary( + name = "iwecfp_database_load", + srcs = [ + "iwecfp_database_load.cc", + ], + tags = ["berkeleydb"], + deps = [ + ":iwecfp_database", + "//Foundational/cmdline:iwcmdline", + "//Foundational/iwmisc", + "//Molecule_Lib:iwmolecule", + "//Molecule_Lib:moleculeio", + "@berkeleydb", + ], +) + +cc_binary( + name = "iwecfp_database_lookup", + srcs = [ + "iwecfp_database_lookup.cc", + ], + tags = ["berkeleydb"], + deps = [ + ":iwecfp_database", + "//Foundational/cmdline:iwcmdline", + "//Molecule_Lib:iwmolecule", + "//Molecule_Lib:moleculeio", + "@berkeleydb", + ], +) + +cc_binary( + name = "smi2rings_bdb", + srcs = [ + "smi2rings_bdb.cc", + ], + tags = ["berkeleydb"], + deps = [ + ":smi2rings_cc_proto", + "//Foundational/cmdline:iwcmdline", + "//Foundational/iwmisc", + "//Molecule_Lib:iwmolecule", + "//Molecule_Lib:moleculeio", + "@berkeleydb", + ], +) + +cc_binary( + name = "substituent_identification", + srcs = [ + "substituent_identification.cc", + ], + tags = ["berkeleydb"], + deps = [ + "//Foundational/cmdline:iwcmdline", + "//Foundational/iwmisc", + "//Molecule_Lib:iwmolecule", + "//Molecule_Lib:moleculeio", + "@berkeleydb", + ], +) + +cc_library( + name = "iwecfp_database", + srcs = [ + "iwecfp_database.cc", + ], + hdrs = [ + "iwecfp_database.h", + ], + tags = ["berkeleydb"], + deps = [ + "//Foundational/cmdline:iwcmdline", + "//Molecule_Lib:iwmolecule", + "@berkeleydb", + ], +) + +cc_library( + name = "storage_conditions", + srcs = [ + "storage_conditions.cc", + ], + hdrs = [ + "storage_conditions.h", + ], + tags = ["berkeleydb"], + deps = [ + "//Foundational/cmdline:iwcmdline", + "//Molecule_Lib:iwmolecule", + "@berkeleydb", + ], +) diff --git a/src/Molecule_Tools/buildsmidb_bdb.cc b/src/Molecule_Tools_Bdb/buildsmidb_bdb.cc similarity index 94% rename from src/Molecule_Tools/buildsmidb_bdb.cc rename to src/Molecule_Tools_Bdb/buildsmidb_bdb.cc index 2765122e..f6d8ea3b 100644 --- a/src/Molecule_Tools/buildsmidb_bdb.cc +++ b/src/Molecule_Tools_Bdb/buildsmidb_bdb.cc @@ -102,6 +102,14 @@ static int discarded_for_max_atoms = 0; // other than the graph. AllVariants all_variants; +// Oct 2023 +// When storing chiral suppressed forms, we can optionally add a prefix +// to the names. Typically this is the '@' character, so when someone +// retrieves a molecule that is matched only by loss of chirality, the +// identifier in the db will be '@123' indicating that this smiles +// came from '123' after losing one or more chiral centres. +static char prefix_for_chirality_removed = ' '; + static void usage(int rc) { // clang-format off @@ -128,9 +136,8 @@ usage(int rc) { //cerr << " -z exclude cis-trans bonding information\n"; cerr << " -b store chiral and non-chiral smiles\n"; cerr << " -l strip to largest fragment\n"; -//cerr << " -I remove isotopes before storing\n"; + cerr << " -I remove isotopes before storing\n"; //cerr << " -u ignore no-structs\n"; - cerr << " -i specify input file type\n"; cerr << " -n separator for when storing duplicate entries\n"; cerr << " -p don't store duplicates\n"; cerr << " -D write duplicates to \n"; @@ -140,10 +147,12 @@ usage(int rc) { cerr << " -C write changed keys to \n"; cerr << " -x discard molecules containing more than atoms\n"; cerr << " -V ... store all structural variants, enter '-V help' for info\n"; + cerr << " -X ... more options, enter '-X help' for info\n"; cerr << " -y suppress messages about bad valences\n"; //(void) display_standard_charge_assigner_options (cerr, 'N'); - (void) display_standard_chemical_standardisation_options(cerr, 'g'); cerr << " -T ... standard element transformation options\n"; + (void) display_standard_chemical_standardisation_options(cerr, 'g'); + cerr << " -i specify input file type\n"; (void) display_standard_aromaticity_options(cerr); cerr << " -v verbose output\n"; // clang-format on @@ -554,8 +563,10 @@ buildsmidb(Molecule &m, const Storage_Conditions &sc, const Mol2Graph &mol2graph } } else if (!sc.remove_chirality()) { rc = buildsmidb(m, sc, 1, mol2graph); + } else if (sc.remove_chirality() && m.chiral_centres() == 0) { + rc = buildsmidb(m, sc, 1, mol2graph); } else { - rc = buildsmidb(m, sc, 0, mol2graph); + rc = buildsmidb(m, sc, 0, mol2graph, prefix_for_chirality_removed); } if (0 == rc) { @@ -678,9 +689,16 @@ do_write_hash(const IW_STL_Hash_Map_String &db_hash, const char *fname) { return do_write_hash(db_hash, output); } +static void +DisplayDashXOptions(std::ostream& output) { + output << " -X chiral= prepend to the names of molecules stored after losing chirality\n"; + + ::exit(0); +} + static int buildsmidb(int argc, char **argv) { - Command_Line cl(argc, argv, "vi:A:g:N:h:T:d:alE:n:D:U:po:Icr:bzuO:tLwC:S:qyH:x:V:"); + Command_Line cl(argc, argv, "vi:A:g:N:h:T:d:alE:n:D:U:po:Icr:bzuO:tLwC:S:qyH:x:V:X:"); if (cl.unrecognised_options_encountered()) { cerr << "Unrecognised options encountered\n"; @@ -708,6 +726,33 @@ buildsmidb(int argc, char **argv) { set_global_aromaticity_type(Daylight); + if (cl.option_present('X')) { + IWString x; + for (int i = 0; cl.value('X', x, i); ++i) { + if (x.starts_with("chiral=")) { + x.remove_leading_chars(7); + char_name_to_char(x); + + if (x.length() != 1) { + cerr << "The '-X chiral=' directive must specify a single character\n"; + return 1; + } + + prefix_for_chirality_removed = x[0]; + + if (verbose) { + cerr << "Will prepend '" << prefix_for_chirality_removed << + "' to molecules stored after losing chiralith\n"; + } + } else if (x == "help") { + DisplayDashXOptions(cerr); + } else { + cerr << "Unrecognised -X qualifier '" << x << "'\n"; + DisplayDashXOptions(cerr); + } + } + } + if (cl.option_present('N')) { if (!charge_assigner.construct_from_command_line(cl, verbose, 'N')) { cerr << "Cannot determine charge assigner from command line\n"; diff --git a/src/Molecule_Tools/dicer_fragment_lookup_bdb.cc b/src/Molecule_Tools_Bdb/dicer_fragment_lookup_bdb.cc similarity index 100% rename from src/Molecule_Tools/dicer_fragment_lookup_bdb.cc rename to src/Molecule_Tools_Bdb/dicer_fragment_lookup_bdb.cc diff --git a/src/Molecule_Tools/in_database_bdb.cc b/src/Molecule_Tools_Bdb/in_database_bdb.cc similarity index 100% rename from src/Molecule_Tools/in_database_bdb.cc rename to src/Molecule_Tools_Bdb/in_database_bdb.cc diff --git a/src/Molecule_Tools/in_lilly_database_bdb.cc b/src/Molecule_Tools_Bdb/in_lilly_database_bdb.cc similarity index 100% rename from src/Molecule_Tools/in_lilly_database_bdb.cc rename to src/Molecule_Tools_Bdb/in_lilly_database_bdb.cc diff --git a/src/Molecule_Tools/iwecfp_database.cc b/src/Molecule_Tools_Bdb/iwecfp_database.cc similarity index 100% rename from src/Molecule_Tools/iwecfp_database.cc rename to src/Molecule_Tools_Bdb/iwecfp_database.cc diff --git a/src/Molecule_Tools/iwecfp_database.h b/src/Molecule_Tools_Bdb/iwecfp_database.h similarity index 100% rename from src/Molecule_Tools/iwecfp_database.h rename to src/Molecule_Tools_Bdb/iwecfp_database.h diff --git a/src/Molecule_Tools/iwecfp_database_load.cc b/src/Molecule_Tools_Bdb/iwecfp_database_load.cc similarity index 100% rename from src/Molecule_Tools/iwecfp_database_load.cc rename to src/Molecule_Tools_Bdb/iwecfp_database_load.cc diff --git a/src/Molecule_Tools/iwecfp_database_lookup.cc b/src/Molecule_Tools_Bdb/iwecfp_database_lookup.cc similarity index 100% rename from src/Molecule_Tools/iwecfp_database_lookup.cc rename to src/Molecule_Tools_Bdb/iwecfp_database_lookup.cc diff --git a/src/Molecule_Tools/smi2rings.proto b/src/Molecule_Tools_Bdb/smi2rings.proto similarity index 100% rename from src/Molecule_Tools/smi2rings.proto rename to src/Molecule_Tools_Bdb/smi2rings.proto diff --git a/src/Molecule_Tools/smi2rings_bdb.cc b/src/Molecule_Tools_Bdb/smi2rings_bdb.cc similarity index 99% rename from src/Molecule_Tools/smi2rings_bdb.cc rename to src/Molecule_Tools_Bdb/smi2rings_bdb.cc index 57058a20..63fc4db0 100644 --- a/src/Molecule_Tools/smi2rings_bdb.cc +++ b/src/Molecule_Tools_Bdb/smi2rings_bdb.cc @@ -39,7 +39,7 @@ #include "Molecule_Lib/substructure.h" #include "Molecule_Lib/target.h" -#include "Molecule_Tools/smi2rings.pb.h" +#include "Molecule_Tools_Bdb/smi2rings.pb.h" using std::cerr; diff --git a/src/Molecule_Tools/storage_conditions.cc b/src/Molecule_Tools_Bdb/storage_conditions.cc similarity index 100% rename from src/Molecule_Tools/storage_conditions.cc rename to src/Molecule_Tools_Bdb/storage_conditions.cc diff --git a/src/Molecule_Tools/storage_conditions.h b/src/Molecule_Tools_Bdb/storage_conditions.h similarity index 100% rename from src/Molecule_Tools/storage_conditions.h rename to src/Molecule_Tools_Bdb/storage_conditions.h diff --git a/src/Molecule_Tools/substituent_identification.cc b/src/Molecule_Tools_Bdb/substituent_identification.cc similarity index 100% rename from src/Molecule_Tools/substituent_identification.cc rename to src/Molecule_Tools_Bdb/substituent_identification.cc diff --git a/src/Utilities/Distance_Matrix/Makefile b/src/Utilities/Distance_Matrix/Makefile deleted file mode 100644 index ffbaa982..00000000 --- a/src/Utilities/Distance_Matrix/Makefile +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright 2018 Eli Lilly and Company -# -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -######################################################################## -IWPROGRAMMES ?= $(PWD)/../../.. -BUILD_DIR ?= . -UNAME ?= Linux-gcc-6.2.0 -include $(IWPROGRAMMES)/makefile.public.$(UNAME) - - -########################## Shared variables ############################ -LIBS = $(LIBZ) $(LIB) - -########################## Template for libary ######################### -# Change the project name -PROJECT_NAME = iwdistance_matrix - -LIBRARY_OBJECTS_LIST = \ - _iwdistance_matrix_byte.o\ - _iwdistance_matrix_int.o\ - _iwdistance_matrix_short.o\ - _iwdistance_matrix_float.o\ - _iwdistance_matrix_double.o\ - _iwdistance_matrix_float_byte.o\ - _iwdistance_matrix_double_byte.o\ - _masquerading_as_byte_float.o\ - _masquerading_as_byte_double.o\ - _dm_to_nn_conditions_float.o\ - _dm_to_nn_conditions_int.o\ - _dm_to_nn_conditions_double.o\ - _dm_to_nn_conditions_uchar.o\ - iwdmsupport.o - -SHARED_INC_FILES = iwdmsupport.h IWDistanceMatrixBase.h Masquerading_as_Byte.h DM_to_NN_Conditions_.h - -LIBRARY_OBJECTS = $(addprefix $(BUILD_DIR)/, $(LIBRARY_OBJECTS_LIST)) - -LIBRARY_STEM = lib$(PROJECT_NAME) - -LIBRARY_NAME = $(BUILD_DIR)/$(LIBRARY_STEM).a - -# Rule for making library obj -$(LIBRARY_OBJECTS): - $(CXX) -c $(CXX_FLAGS_WITH_IMPLICIT_TEMPLATES) $(basename $(notdir $@)).cc -o $@ - -# Rule for making library -$(LIBRARY_NAME): $(LIBRARY_OBJECTS) - $(AR) r $@ $(LIBRARY_OBJECTS) - -#Release 5 -################# Template for public executables ###################### -DMFROMDISTANCES_EXE = $(BUILD_DIR)/distance_matrix_from_distances -DMFROMDISTANCES_OBJECTS = $(BUILD_DIR)/distance_matrix_from_distances.o -$(BUILD_DIR)/distance_matrix_from_distances.o: distance_matrix_from_distances.cc - $(CXX) -c -o $@ $< $(CXX_FLAGS_WITH_IMPLICIT_TEMPLATES) -$(BUILD_DIR)/distance_matrix_from_distances: $(DMFROMDISTANCES_OBJECTS) - $(LD) -o $@ $(DMFROMDISTANCES_OBJECTS) $(LIBS) -liwdistance_matrix -laccumulator -lcmdline -liwstring_data_source -liwcrex -liwstring -liwmisc -liwaray $(SYSTEM_LIBS) -EXECUTABLES += $(DMFROMDISTANCES_EXE) - -################# Template for public executables ###################### -SPREAD_EXE = $(BUILD_DIR)/distance_matrix_spread -SPREAD_OBJECTS = $(BUILD_DIR)/distance_matrix_spread.o -#$(BUILD_DIR)/_iwdistance_matrix_float.o -$(BUILD_DIR)/distance_matrix_spread.o: distance_matrix_spread.cc - $(CXX) -c -o $@ $< $(CXX_FLAGS_WITH_IMPLICIT_TEMPLATES) -$(BUILD_DIR)/distance_matrix_spread: $(SPREAD_OBJECTS) - $(LD) -o $@ $(SPREAD_OBJECTS) $(LIBS) -liwdistance_matrix -liwrandom -lcmdline -liwstring_data_source -liwcrex -liwstring -liwmisc -liwaray $(SYSTEM_LIBS) -EXECUTABLES += $(SPREAD_EXE) - -###################### Template for build command ###################### -.PHONY: copy_include -.PHONY: library -.PHONY: copy_library -.PHONY: exe -.PHONY: copy_exe -.PHONY: clean -.PHONY: veryclean - - -replace_exe: - @echo "Nothing to do for $(PROJECT_NAME) target $@" - -copy_include: - $(CP) $(SHARED_INC_FILES) $(INCDIR) - -# Rule for making static library -library: $(LIBRARY_NAME) - -# Rule for installing static library -copy_library: copy_include library - $(CP) $(LIBRARY_NAME) $(LIBDIR) - -# Rule for making executables -exe: $(EXECUTABLES) - -# Rule for install executables -copy_exe: exe - $(CP) $(EXECUTABLES) $(EXEDIR) - -clean: - @$(RM) $(BUILD_DIR)/*.o || true - -veryclean: clean - @$(RM) $(BUILD_DIR)/*.a || true - diff --git a/src/Utilities/GFP_Tools/BUILD b/src/Utilities/GFP_Tools/BUILD index 4261b75e..c108b98e 100644 --- a/src/Utilities/GFP_Tools/BUILD +++ b/src/Utilities/GFP_Tools/BUILD @@ -315,24 +315,23 @@ cc_binary( ], ) -# Enable if MPI is enabled in the current environment. -# cc_binary( -# name = "gfp_leader_threaded_mpi", -# srcs = [ -# "gfp_leader_threaded_mpi.cc", -# ], -# tags = [ -# "mpi", -# ], -# deps = [ -# "//Foundational/accumulator", -# "//Foundational/cmdline:iwcmdline", -# "//Foundational/data_source:iwstring_data_source", -# "//Foundational/iwmisc", -# "//Utilities/GFP_Tools:gfp", -# "@mpich", -# ], -# ) +#cc_binary( +# name = "gfp_leader_threaded_mpi", +# srcs = [ +# "gfp_leader_threaded_mpi.cc", +# ], +# tags = [ +# "mpi", +# ], +# deps = [ +# "//Foundational/accumulator", +# "//Foundational/cmdline:iwcmdline", +# "//Foundational/data_source:iwstring_data_source", +# "//Foundational/iwmisc", +# "//Utilities/GFP_Tools:gfp", +# "@mpich", +# ], +#) cc_binary( name = "gfp_mcs", diff --git a/src/Utilities/GFP_Tools/Enrichment.h b/src/Utilities/GFP_Tools/Enrichment.h index d30b5d4a..4140e675 100644 --- a/src/Utilities/GFP_Tools/Enrichment.h +++ b/src/Utilities/GFP_Tools/Enrichment.h @@ -1,6 +1,7 @@ #ifndef ENRICHMENT_H #define ENRICHMENT_H +#include #include #include //class ostream; diff --git a/src/Utilities/GFP_Tools/Makefile b/src/Utilities/GFP_Tools/Makefile deleted file mode 100644 index cde26dc9..00000000 --- a/src/Utilities/GFP_Tools/Makefile +++ /dev/null @@ -1,319 +0,0 @@ -# Copyright 2018 Eli Lilly and Company -# -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -######################################################################## -IWPROGRAMMES ?= $(PWD)/../../.. -BUILD_DIR ?= . -UNAME ?= Linux-gcc-6.2.0 -include $(IWPROGRAMMES)/makefile.public.$(UNAME) - -########################## Shared variables ############################ -LIBS = $(LIB) -lgfp -liwmolecule -liwstring_data_source -liwtemplate -liwstring -lsparsefp -laccumulator -lcmdline -liwhistogram -liwbits -liwaray -liwtdt -liwmisc -liwrandom -liwcrex -lxmlParser $(LIBZ) $(USRLIB) $(SYSTEM_LIBS) - -LIBTEMPLATE = -liwtemplate - -$(BUILD_DIR)/%.o : %.cc - $(CXX) -c -o $@ $< $(CXX_FLAGS_WITH_IMPLICIT_TEMPLATES) - -########################## Template for libary ######################### -PROJECT_NAME = gfp - -LIBRARY_OBJECTS_LIST = \ - dyfp.o gfp.o \ - sparsefp.o \ - various_distance_metrics.o \ - sparse_collection.o \ - fixed_size_counted_fingerprint_uchar.o \ - _fixed_size_counted_fingerprint_uchar.o \ - fixed_size_counted_fingerprint_uint.o \ - _fixed_size_counted_fingerprint_uint.o \ - bic_table.o \ - multi_conformer.o \ - tversky.o \ - gfp_contiguous.o \ - count_tdts.o \ - gfp_standard.o \ - smiles_id_dist.o neighbour_list.o fp_and_smiles.o \ - _resizable_array_sid.o _neighbour_list_fp_and_smiles.o \ - spread_v2.o _resizable_array_spread_v2_object.o - -SHARED_INC_FILES = gfp.h tversky.h sparsefp.h dyfp.h leader.h spread_v2.h \ - multi_conformer.h gfp_standard.h fixed_size_counted_fingerprint.h \ - sparse_collection.h \ - smiles_id_dist.h neighbour_list.h - -LIBRARY_OBJECTS = $(addprefix $(BUILD_DIR)/, $(LIBRARY_OBJECTS_LIST)) - -LIBRARY_STEM = lib$(PROJECT_NAME) - -LIBRARY_NAME = $(BUILD_DIR)/$(LIBRARY_STEM).a - -# Rule for making library obj -$(LIBRARY_OBJECTS): - $(CXX) -c $(CXX_FLAGS_WITH_IMPLICIT_TEMPLATES) $(basename $(notdir $@)).cc -o $@ - -# Rule for making library -$(LIBRARY_NAME): $(LIBRARY_OBJECTS) - $(AR) r $@ $(LIBRARY_OBJECTS) - - -################# Template for public executables ###################### -ADD_DESCRIPTORS_EXE = $(BUILD_DIR)/gfp_add_descriptors -ADD_DESCRIPTORS_OBJECTS = $(BUILD_DIR)/gfp_add_descriptors.o -$(BUILD_DIR)/gfp_add_descriptors: $(ADD_DESCRIPTORS_OBJECTS) - $(LD) $(PROF) -o $@ $(OPENMP) $(ADD_DESCRIPTORS_OBJECTS) $(LIBS) -EXECUTABLES += $(ADD_DESCRIPTORS_EXE) - -################## Template for public executables ###################### -DESCRIPTORS_TO_01_FINGERPRINT_EXE = $(BUILD_DIR)/descriptor_file_to_01_fingerprints -DESCRIPTORS_TO_01_FINGERPRINT_OBJECTS = $(BUILD_DIR)/descriptor_file_to_01_fingerprints.o -$(BUILD_DIR)/descriptor_file_to_01_fingerprints: $(DESCRIPTORS_TO_01_FINGERPRINT_OBJECTS) - $(LD) -o $@ $(PROF) $(DESCRIPTORS_TO_01_FINGERPRINT_OBJECTS) $(LIBS) -lsparsefp -liwmisc -liwbits $(SYSTEM_LIBS) -EXECUTABLES += $(DESCRIPTORS_TO_01_FINGERPRINT_EXE) - -################# Template for public executables ###################### -DISTANCE_MATRIX_EXE = $(BUILD_DIR)/gfp_distance_matrix -DISTANCE_MATRIX_OBJECTS = $(BUILD_DIR)/gfp_distance_matrix.o $(BUILD_DIR)/build_pool.o -$(BUILD_DIR)/gfp_distance_matrix.o: gfp_distance_matrix.cc -$(BUILD_DIR)/gfp_distance_matrix: $(DISTANCE_MATRIX_OBJECTS) - $(LD) $(PROF) -o $@ $(DISTANCE_MATRIX_OBJECTS) $(LIBS) -liwstring -liwaray -EXECUTABLES += $(DISTANCE_MATRIX_EXE) - -################## Template for public executables ###################### -FINGERPRINTS_TO_DESCRIPTORS_EXE = $(BUILD_DIR)/gfp_to_descriptors -FINGERPRINTS_TO_DESCRIPTORS_OBJECTS = $(BUILD_DIR)/gfp_to_descriptors.o -$(BUILD_DIR)/gfp_to_descriptors.o: gfp_to_descriptors.cc -$(BUILD_DIR)/gfp_to_descriptors: $(FINGERPRINTS_TO_DESCRIPTORS_OBJECTS) - $(LD) $(PROF) -o $@ $(FINGERPRINTS_TO_DESCRIPTORS_OBJECTS) $(LIBS) -EXECUTABLES += $(FINGERPRINTS_TO_DESCRIPTORS_EXE) - -################# Template for public executables ###################### -GFP_PAIRWISE_DISTANCES_EXE = $(BUILD_DIR)/gfp_pairwise_distances -GFP_PAIRWISE_DISTANCES_OBJECTS = $(BUILD_DIR)/gfp_pairwise_distances.o -$(BUILD_DIR)/gfp_pairwise_distances.o: gfp_pairwise_distances.cc -$(BUILD_DIR)/gfp_pairwise_distances: $(GFP_PAIRWISE_DISTANCES_OBJECTS) - $(LD) $(PROF) -o $@ $(GFP_PAIRWISE_DISTANCES_OBJECTS) $(LIBS) -liwtdt -EXECUTABLES += $(GFP_PAIRWISE_DISTANCES_EXE) - -################# Template for public executables ###################### -DISTANCE_FILTER_EXE = $(BUILD_DIR)/gfp_distance_filter -DISTANCE_FILTER_OBJECTS = $(BUILD_DIR)/gfp_distance_filter.o -$(BUILD_DIR)/gfp_distance_filter.o: gfp_distance_filter.cc -$(BUILD_DIR)/gfp_distance_filter: $(DISTANCE_FILTER_OBJECTS) - $(LD) $(PROF) -o $@ $(DISTANCE_FILTER_OBJECTS) $(LIBS) -liwbits -EXECUTABLES += $(DISTANCE_FILTER_EXE) - -################# Template for public executables ###################### -SPARSE_TO_FIXED_EXE = $(BUILD_DIR)/gfp_sparse_to_fixed -SPARSE_TO_FIXED_OBJECTS = $(BUILD_DIR)/gfp_sparse_to_fixed.o -$(BUILD_DIR)/gfp_sparse_to_fixed.o: gfp_sparse_to_fixed.cc -$(BUILD_DIR)/gfp_sparse_to_fixed: $(SPARSE_TO_FIXED_OBJECTS) - $(LD) $(PROF) -o $@ $(SPARSE_TO_FIXED_OBJECTS) $(LIBS) -liwbits -liwtdt -laccumulator $(LIBTEMPLATE) $(SYSTEM_LIBS) -EXECUTABLES += $(SPARSE_TO_FIXED_EXE) - -################# Template for public executables ###################### -SINGLE_LINKAGE_EXE = $(BUILD_DIR)/gfp_single_linkage -SINGLE_LINKAGE_OBJECTS = $(BUILD_DIR)/gfp_single_linkage.o $(BUILD_DIR)/distance_cache.o -$(BUILD_DIR)/gfp_single_linkage.o: gfp_single_linkage.cc -$(BUILD_DIR)/gfp_single_linkage: $(SINGLE_LINKAGE_OBJECTS) - $(LD) $(PROF) -o $@ $(SINGLE_LINKAGE_OBJECTS) -liwrandom $(LIBS) -EXECUTABLES += $(SINGLE_LINKAGE_EXE) - - -################# Template for public executables ###################### -NEARNEIGHBOURS_SINGLE_FILE_EXE = $(BUILD_DIR)/gfp_nearneighbours_single_file -NEARNEIGHBOURS_SINGLE_FILE_OBJECTS = $(BUILD_DIR)/gfp_nearneighbours_single_file.o -$(BUILD_DIR)/gfp_nearneighbours_single_file.o: gfp_nearneighbours_single_file.cc -$(BUILD_DIR)/gfp_nearneighbours_single_file: $(NEARNEIGHBOURS_SINGLE_FILE_OBJECTS) - $(LD) $(PROF) -o $@ $(NEARNEIGHBOURS_SINGLE_FILE_OBJECTS) $(LIBS) $(IWMALLOC) -EXECUTABLES += $(NEARNEIGHBOURS_SINGLE_FILE_EXE) - - -################# Template for public executables ###################### -NEARNEIGHBOURS_EXE = $(BUILD_DIR)/gfp_nearneighbours -NEARNEIGHBOURS_OBJECTS = $(BUILD_DIR)/gfp_nearneighbours.o -$(BUILD_DIR)/gfp_nearneighbours.o: gfp_nearneighbours.cc -$(BUILD_DIR)/gfp_nearneighbours: $(NEARNEIGHBOURS_OBJECTS) - $(LD) $(PROF) -o $@ $(NEARNEIGHBOURS_OBJECTS) $(LIBS) -EXECUTABLES += $(NEARNEIGHBOURS_EXE) - -################# Template for public executables ###################### -LEADER_V2_EXE = $(BUILD_DIR)/gfp_leader_v2 -LEADER_V2_OBJECTS = $(BUILD_DIR)/gfp_leader_v2.o $(BUILD_DIR)/_rsa_leader.o -$(BUILD_DIR)/gfp_leader_v2.o: gfp_leader_v2.cc -$(BUILD_DIR)/gfp_leader_v2: $(LEADER_V2_OBJECTS) - $(LD) $(PROF) -o $@ $(LEADER_V2_OBJECTS) $(LIBS) -liwrandom -EXECUTABLES += $(LEADER_V2_EXE) - -################# Template for public executables ###################### -LARGE_NEARNEIGHBOURS_EXE = $(BUILD_DIR)/gfp_lnearneighbours -LARGE_NEARNEIGHBOURS_OBJECTS = $(BUILD_DIR)/gfp_lnearneighbours.o $(BUILD_DIR)/fb_bits_and_weights.o -$(BUILD_DIR)/gfp_lnearneighbours: $(LARGE_NEARNEIGHBOURS_OBJECTS) - $(LD) $(PROF) -o $@ $(LARGE_NEARNEIGHBOURS_OBJECTS) $(LIBS) -EXECUTABLES += $(LARGE_NEARNEIGHBOURS_EXE) - -################# Template for public executables ###################### -PROFILE_ACTIVITY_EXE = $(BUILD_DIR)/gfp_profile_activity_by_bits -PROFILE_ACTIVITY_OBJECTS = $(BUILD_DIR)/gfp_profile_activity_by_bits.o $(BUILD_DIR)/bit_and_weight.o -$(BUILD_DIR)/gfp_profile_activity_by_bits.o: gfp_profile_activity_by_bits.cc nbc.h -$(BUILD_DIR)/gfp_profile_activity_by_bits: $(PROFILE_ACTIVITY_OBJECTS) - $(LD) $(PROF) -o $@ $(PROFILE_ACTIVITY_OBJECTS) $(LIBS) -liwbits -liwcrex -laccumulator $(LIBTEMPLATE) $(SYSTEM_LIBS) -EXECUTABLES += $(PROFILE_ACTIVITY_EXE) - -################# Template for public executables ###################### -SPREAD_V2_EXE = $(BUILD_DIR)/gfp_spread_v2 -SPREAD_V2_OBJECTS = $(BUILD_DIR)/gfp_spread_v2.o \ - $(BUILD_DIR)/_resizable_array_spread_v2_object.o -$(BUILD_DIR)/gfp_spread_v2.o: gfp_spread_v2.cc -$(BUILD_DIR)/gfp_spread_v2: $(SPREAD_V2_OBJECTS) - $(LD) $(PROF) -o $@ $(SPREAD_V2_OBJECTS) -liwrandom $(LIBS) -liwstring -liwaray -lm -EXECUTABLES += $(SPREAD_V2_EXE) - -################# Template for public executables ###################### -PLOTNN_EXE = $(BUILD_DIR)/nplotnn -PLOTNN_OBJECTS = $(BUILD_DIR)/nplotnn.o $(BUILD_DIR)/distance_scaling.o -$(BUILD_DIR)/nplotnn.o: nplotnn.cc distance_scaling.h -$(BUILD_DIR)/nplotnn: $(PLOTNN_OBJECTS) - $(LD) $(PROF) -o $@ $(PLOTNN_OBJECTS) $(LIBS) -EXECUTABLES += $(PLOTNN_EXE) - -################# Template for public executables ###################### -SPREAD_BUCKETS_V2_EXE = $(BUILD_DIR)/gfp_spread_buckets_v2 -SPREAD_BUCKETS_V2_OBJECTS = $(BUILD_DIR)/gfp_spread_buckets_v2.o -$(BUILD_DIR)/gfp_spread_buckets_v2.o: gfp_spread_buckets_v2.cc -$(BUILD_DIR)/gfp_spread_buckets_v2: $(SPREAD_BUCKETS_V2_OBJECTS) - $(LD) $(PROF) -o $@ $(SPREAD_BUCKETS_V2_OBJECTS) -liwrandom -liwmisc $(LIBS) -liwbits -EXECUTABLES += $(SPREAD_BUCKETS_V2_EXE) - -################# Template for public executables ###################### -TDT_SORT_EXE = $(BUILD_DIR)/tdt_sort -TDT_SORT_OBJECTS = $(BUILD_DIR)/tdt_sort.o -$(BUILD_DIR)/tdt_sort: $(TDT_SORT_OBJECTS) - $(LD) $(PROF) -o $@ $(TDT_SORT_OBJECTS) -lcmdline_v2 -liwrandom -liwmisc $(LIBS) -EXECUTABLES += $(TDT_SORT_EXE) - -################# Template for public executables ###################### -TDT_JOIN_EXE = $(BUILD_DIR)/tdt_join -TDT_JOIN_OBJECTS = $(BUILD_DIR)/tdt_join.o -$(BUILD_DIR)/tdt_join: $(TDT_JOIN_OBJECTS) - $(LD) -o $@ $(TDT_JOIN_OBJECTS) $(LIBS) -liwmisc $(SYSTEM_LIBS) -EXECUTABLES += $(TDT_JOIN_EXE) - -################## Template for public executables ###################### -#DISTANCE_MATRIX_DMC_EXE = $(BUILD_DIR)/gfp_distance_matrix_iwdm -#DISTANCE_MATRIX_DMC_OBJECTS = $(BUILD_DIR)/gfp_distance_matrix_iwdm.o -#$(BUILD_DIR)/gfp_distance_matrix_iwdm.o: gfp_distance_matrix_iwdm.cc -#$(BUILD_DIR)/gfp_distance_matrix_iwdm: $(DISTANCE_MATRIX_DMC_OBJECTS) -# $(LD) $(PROF) -o $@ $(DISTANCE_MATRIX_DMC_OBJECTS) -liwdistance_matrix $(LIBS) -#EXECUTABLES += $(DISTANCE_MATRIX_DMC_EXE) - -################# Template for public executables ###################### -LEADER_STD_EXE = $(BUILD_DIR)/gfp_leader_standard -LEADER_STD_OBJECTS = $(BUILD_DIR)/gfp_leader_standard.o -$(BUILD_DIR)/gfp_leader_standard.o: gfp_leader_standard.cc -$(BUILD_DIR)/gfp_leader_standard: $(LEADER_STD_OBJECTS) - $(LD) $(PROF) -o $@ $(OPENMP) $(LEADER_STD_OBJECTS) $(LIBS) $(SYSTEM_LIBS) -liwmisc -EXECUTABLES += $(LEADER_STD_EXE) - -################# Template for public executables ###################### -LARGE_NEARNEIGHBOURS_STANDARD_EXE = $(BUILD_DIR)/gfp_lnearneighbours_standard -LARGE_NEARNEIGHBOURS_STANDARD_OBJECTS = $(BUILD_DIR)/gfp_lnearneighbours_standard.o -$(BUILD_DIR)/gfp_lnearneighbours_standard.o: gfp_lnearneighbours_standard.cc -$(BUILD_DIR)/gfp_lnearneighbours_standard: $(LARGE_NEARNEIGHBOURS_STANDARD_OBJECTS) - $(LD) $(PROF) -o $@ $(LARGE_NEARNEIGHBOURS_STANDARD_OBJECTS) $(LIBS) -EXECUTABLES += $(LARGE_NEARNEIGHBOURS_STANDARD_EXE) - -################## Template for public executables ###################### -GFP_NAIVE_BAYESIAN_EXE = $(BUILD_DIR)/gfp_naive_bayesian -GFP_NAIVE_BAYESIAN_OBJECTS = $(BUILD_DIR)/gfp_naive_bayesian.o -$(BUILD_DIR)/gfp_naive_bayesian.o: gfp_naive_bayesian.cc -#bit_subset_v2.h -$(BUILD_DIR)/gfp_naive_bayesian: $(GFP_NAIVE_BAYESIAN_OBJECTS) - $(LD) $(PROF) -o $@ $(GFP_NAIVE_BAYESIAN_OBJECTS) $(LIBS) -liwbits -liwcrex -laccumulator $(LIBTEMPLATE) $(SYSTEM_LIBS) -EXECUTABLES += $(GFP_NAIVE_BAYESIAN_EXE) - -################# Template for public executables ###################### -SPREAD_STANDARD_EXE = $(BUILD_DIR)/gfp_spread_standard -SPREAD_STANDARD_OBJECTS = $(BUILD_DIR)/gfp_spread_standard.o -$(BUILD_DIR)/gfp_spread_standard: $(SPREAD_STANDARD_OBJECTS) - $(LD) $(PROF) -o $@ $(OPENMP) $(SPREAD_STANDARD_OBJECTS) -liwrandom -liwbits -lm $(LIBS) -EXECUTABLES += $(SPREAD_STANDARD_EXE) - -################# Template for public executables ###################### -FINGERPRINTS_TO_DESCRIPTORS_MULTIPLE_EXE = $(BUILD_DIR)/gfp_to_descriptors_multiple -FINGERPRINTS_TO_DESCRIPTORS_MULTIPLE_OBJECTS = $(BUILD_DIR)/gfp_to_descriptors_multiple.o -$(BUILD_DIR)/gfp_to_descriptors_multiple.o: gfp_to_descriptors_multiple.cc -$(BUILD_DIR)/gfp_to_descriptors_multiple: $(FINGERPRINTS_TO_DESCRIPTORS_MULTIPLE_OBJECTS) - $(LD) $(PROF) -o $@ $(FINGERPRINTS_TO_DESCRIPTORS_MULTIPLE_OBJECTS) $(LIBS) -EXECUTABLES += $(FINGERPRINTS_TO_DESCRIPTORS_MULTIPLE_EXE) - -################# Template for public executables ###################### -LEADER_MULTIPLE_THRESHOLD_EXE = $(BUILD_DIR)/nn_leader_and_jp -LEADER_MULTIPLE_THRESHOLD_OBJECTS = $(BUILD_DIR)/nn_leader_and_jp.o -$(BUILD_DIR)/nn_leader_and_jp.o: nn_leader_and_jp.cc -$(BUILD_DIR)/nn_leader_and_jp: $(LEADER_MULTIPLE_THRESHOLD_OBJECTS) - $(LD) $(PROF) -o $@ $(LEADER_MULTIPLE_THRESHOLD_OBJECTS) $(LIBS) -laccumulator -liwmisc -EXECUTABLES += $(LEADER_MULTIPLE_THRESHOLD_EXE) - - -################# Template for public executables ###################### -DISTANCE_MATRIX_DMC_EXE = $(BUILD_DIR)/gfp_distance_matrix_iwdm -DISTANCE_MATRIX_DMC_OBJECTS = $(BUILD_DIR)/gfp_distance_matrix_iwdm.o -$(BUILD_DIR)/gfp_distance_matrix_iwdm.o: gfp_distance_matrix_iwdm.cc -$(BUILD_DIR)/gfp_distance_matrix_iwdm: $(DISTANCE_MATRIX_DMC_OBJECTS) - $(LD) $(PROF) -o $@ $(DISTANCE_MATRIX_DMC_OBJECTS) -liwdistance_matrix $(LIBS) -EXECUTABLES += $(DISTANCE_MATRIX_DMC_EXE) - -################# Template for public executables ###################### -IWSTATS_EXE = $(BUILD_DIR)/iwstats -IWSTATS_OBJECTS = $(BUILD_DIR)/iwstats.o $(BUILD_DIR)/bsquared.o $(BUILD_DIR)/Metric.o $(BUILD_DIR)/Enrichment.o -$(BUILD_DIR)/iwstats.o: iwstats.cc bsquared.h -$(BUILD_DIR)/iwstats: $(IWSTATS_OBJECTS) - $(LD) $(PROF) -o $@ $(IWSTATS_OBJECTS) -liwmisc $(LIBS) -liwrandom -EXECUTABLES += $(IWSTATS_EXE) -###################### Template for build command ###################### -.PHONY: copy_include -.PHONY: library -.PHONY: copy_library -.PHONY: exe -.PHONY: copy_exe -.PHONY: clean -.PHONY: veryclean - -replace_exe: - @echo "Nothing to do for $(PROJECT_NAME) target $@" - -copy_include: - $(CP) $(SHARED_INC_FILES) $(INCDIR) - -# Rule for making static library -library: $(LIBRARY_NAME) - -# Rule for installing static library -copy_library: copy_include library - $(CP) $(LIBRARY_NAME) $(LIBDIR) - -# Rule for making executables -exe: $(EXECUTABLES) - -# Rule for install executables -copy_exe: exe - $(CP) $(EXECUTABLES) $(EXEDIR) - -clean: - @$(RM) $(BUILD_DIR)/*.o || true - -veryclean: clean - @$(RM) $(BUILD_DIR)/*.a || true - @$(RM) $(EXECUTABLES) || true diff --git a/src/Utilities/GFP_Tools/gfp.cc b/src/Utilities/GFP_Tools/gfp.cc index 137ded1d..9d239ce6 100644 --- a/src/Utilities/GFP_Tools/gfp.cc +++ b/src/Utilities/GFP_Tools/gfp.cc @@ -2327,6 +2327,7 @@ IW_General_Fingerprint::_construct_from_tdt(IW_TDT& tdt, int& fatal) { << "', but not specified on command line, suppressed\n"; molecular_property_integer_tag.resize(0); } else if (!_read_molecular_properties_integer(tdt, molecular_property_integer_tag)) { + cerr << "Cannot read molecular properties\n"; fatal = 1; return 0; } @@ -2334,6 +2335,7 @@ IW_General_Fingerprint::_construct_from_tdt(IW_TDT& tdt, int& fatal) { if (molecular_property_continuous_tag.length()) { if (!_read_molecular_properties_continuous(tdt, molecular_property_continuous_tag)) { + cerr << "Cannot read continuous molecular properties\n"; fatal = 1; return 0; } diff --git a/src/Utilities/GFP_Tools/gfp_collection_fingerprint.cc b/src/Utilities/GFP_Tools/gfp_collection_fingerprint.cc new file mode 100644 index 00000000..fd372340 --- /dev/null +++ b/src/Utilities/GFP_Tools/gfp_collection_fingerprint.cc @@ -0,0 +1,580 @@ +// Generate a composite fingerprint for a collection of molecules. + +#include +#include +#include +#include + +#include "absl/container/flat_hash_map.h" + +#include "Foundational/accumulator/accumulator.h" +#include "Foundational/cmdline/cmdline.h" +#include "Foundational/data_source/iwstring_data_source.h" +#include "Foundational/iwmisc/sparse_fp_creator.h" +#include "Foundational/iwstring/iwstring.h" +#include "Foundational/iw_tdt/iw_tdt.h" + +#include "gfp.h" + +namespace gfp_collection_fingerprint { + +using std::cerr; + +void +Usage(int rc) { +// clang-format off +#if defined(GIT_HASH) && defined(TODAY) + cerr << __FILE__ << " compiled " << TODAY << " git hash " << GIT_HASH << '\n'; +#else + cerr << __FILE__ << " compiled " << __DATE__ << " " << __TIME__ << '\n'; +#endif + // clang-format on + // clang-format off + cerr << R"(Computes a composite fingerprint for a collection of fingerprints. +By default all fixed and sparse fingerprints are processed. In addition, with the -p option, +pairs of fixed and/or sparse fingerprints can also be included. + -p fixed profile pairs of fixed fingerprints. + -p sparse profile pairs of sparse fingerprints. + -u specify support level for a feature or feature combination to be included + -T write <title> to the PCN<> tag of the output + -v verbose output +)"; + + // clang-format on + + ::exit(rc); +} + +class CollectionData { + private: + enum ScalingType { + kLinear = 0, + kLog10 = 1 + }; + + private: + int _verbose; + + ScalingType _scaling_type; + + // For keeping track of the bits encountered. + + // Fixed width fingerprints + std::unique_ptr<std::vector<uint32_t>[]> _fixed; + std::unique_ptr<std::vector<uint32_t>[]> _pairwise_fixed; + + // Sparse fingerprints + std::unique_ptr<absl::flat_hash_map<uint32_t, uint32_t>[]> _sparse; + std::unique_ptr<absl::flat_hash_map<uint32_t, uint32_t>[]> _pairwise_sparse; + + int _first_call; + // We cache these from number_fingerprints() and number_sparse_fingerprints() + int _nfixed; + int _nsparse; + + uint32_t _support; + + int _collect_pairwise_fixed_bits; + int _collect_pairwise_sparse_bits; + + Sparse_Fingerprint_Creator _sfc; + + IWString _fixed_tag, _fixed_pairwise_tag; + IWString _sparse_tag, _sparse_pairwise_tag; + + // private functions + int AllocateFingerprintArrays(IW_General_Fingerprint& fp); + int ProfileFixed(const IWDYFP& fp, std::vector<uint32_t>& collect); + int ProfilePairwiseFixed(const IWDYFP& fp, std::vector<uint32_t>& collect); + int ProfileSparse(const Sparse_Fingerprint& fp, + absl::flat_hash_map<uint32_t, uint32_t>& acc); + int ProfilePairwiseSparse(const Sparse_Fingerprint& fp, + absl::flat_hash_map<uint32_t, uint32_t>& acc); + int WriteFixed(std::vector<uint32_t>& acc, const IWString& tag, IWString_and_File_Descriptor& output); + int WriteSparse(const absl::flat_hash_map<uint32_t, uint32_t>& acc, const IWString& tag, IWString_and_File_Descriptor& output); + + int LinearScalingFixed(std::vector<uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output); + int LogarithmicScalingFixed(std::vector<uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output); + int LinearScalingSparse(const absl::flat_hash_map<uint32_t, uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output); + int Log10ScalingSparse(const absl::flat_hash_map<uint32_t, uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output); + + public: + CollectionData(); + ~CollectionData(); + + int Initialise(Command_Line& cl); + + int Profile(IW_General_Fingerprint& fp); + + int Write(IWString_and_File_Descriptor& output); +}; + +CollectionData::CollectionData() { + _verbose = 0; + _scaling_type = kLinear; + _first_call = 1; + _nfixed = 0; + _nsparse = 0; + _collect_pairwise_fixed_bits = 0; + _collect_pairwise_sparse_bits = 0; + + _support = 1; + + _fixed_tag = "NCFIX"; + _sparse_tag = "NCSPA"; +} + +CollectionData::~CollectionData() { +} + +int +CollectionData::Initialise(Command_Line& cl) { + _verbose = cl.option_present('v'); + + if (cl.option_present('p')) { + const_IWSubstring p; + for (int i = 0; cl.value('p', p, i); ++i) { + if (p == "fixed") { + _collect_pairwise_fixed_bits = 1; + } else if (p == "sparse") { + _collect_pairwise_sparse_bits = 1; + } else { + cerr << "Unrecognised -p qualifier '" << p << "'\n"; + return 0; + } + } + } + + if (cl.option_present('s')) { + const_IWSubstring s; + for (int i = 0; cl.value('s', s, i); ++i) { + if (s == "linear") { + _scaling_type = kLinear; + } else if (s == "log10") { + _scaling_type = kLog10; + } else { + cerr << "Unrecognised -s qualifier '" << s << "'\n"; + return 0; + } + } + } + + if (cl.option_present('u')) { + if (! cl.value('u', _support)) { + cerr << "Invalid support value (-u)\n"; + return 0; + } + + if (_verbose) { + cerr << "Will ignore bits and bit combinations occurring less than " << _support << " times\n"; + } + } + + return 1; +} + +int +CollectionData::AllocateFingerprintArrays(IW_General_Fingerprint& fp) { + _nfixed = number_fingerprints(); + _nsparse = number_sparse_fingerprints(); + if (_nfixed == 0 && _nsparse == 0) { + cerr << "CollectionData::AllocateFingerprintArrays:no fingerprints\n"; + return 0; + } + + // Note that we significantly over-allocate the arrays in the case of + // pairwise fixed fingerprints, but it would be much more complex to + // make it smaller. + if (_nfixed) { + _fixed = std::make_unique<std::vector<uint32_t>[]>(_nfixed); + if (_collect_pairwise_fixed_bits) { + _pairwise_fixed = std::make_unique<std::vector<uint32_t>[]>(_nfixed); + } + for (int i = 0; i < _nfixed; ++i) { + const int nbits = fp[i].nbits(); + _fixed[i].resize(nbits); + if (_collect_pairwise_fixed_bits) { + _pairwise_fixed[i].resize(nbits * nbits); + } + } + } + + if (_nsparse) { + _sparse = std::make_unique<absl::flat_hash_map<uint32_t, uint32_t>[]>(_nsparse); + _pairwise_sparse = std::make_unique<absl::flat_hash_map<uint32_t, uint32_t>[]>(_nsparse); + } + + _first_call = 0; + + return 1; +} + +int +CollectionData::Profile(IW_General_Fingerprint& fp) { + if (_first_call) { + if (! AllocateFingerprintArrays(fp)) { + return 0; + } + _first_call = 0; + } + + for (int i = 0; i < _nfixed; ++i) { + ProfileFixed(fp[i], _fixed[i]); + if (_collect_pairwise_fixed_bits) { + ProfilePairwiseFixed(fp[i], _pairwise_fixed[i]); + } + } + + for (int i = 0; i < _nsparse; ++i) { + ProfileSparse(fp.sparse_fingerprint(i), _sparse[i]); + if (_collect_pairwise_sparse_bits) { + ProfilePairwiseSparse(fp.sparse_fingerprint(i), _pairwise_sparse[i]); + } + } + + return 1; +} + +int +CollectionData::ProfileFixed(const IWDYFP& fp, std::vector<uint32_t>& collect) { + cerr << "Fingerprint with " << fp.nbits() << " bits being profiled\n"; + int ndx = 0; + while (true) { + int bit = fp.next_on_bit(ndx); + // cerr << " Bit " << bit << '\n'; + if (bit < 0) { + break; + } + ++collect[bit]; + } + + return 1; +} + +int +CollectionData::ProfilePairwiseFixed(const IWDYFP& fp, std::vector<uint32_t>& collect) { + int ndx1 = 0; + while (true) { + int bit1 = fp.next_on_bit(ndx1); + if (bit1 < 0) { + break; + } + + ++collect[bit1]; + + int ndx2 = ndx1 + 1; + while (true) { + int bit2 = fp.next_on_bit(ndx2); + if (bit2 < 0) { + break; + } + + uint32_t ndx = fp.nbits() + bit1 * fp.nbits() + bit2; + //cerr << "Index of " << bit1 << " and " << bit2 << " is " << ndx << '\n'; + ++collect[ndx]; + } + } + + return 1; +} +int +CollectionData::ProfileSparse(const Sparse_Fingerprint& fp, + absl::flat_hash_map<uint32_t, uint32_t>& acc) { + uint32_t bit; + int count; + int i = 0; + while (fp.next_bit_set(i, bit, count)) { + ++acc[bit]; + } + + return 1; +} + +int +CollectionData::ProfilePairwiseSparse(const Sparse_Fingerprint& fp, + absl::flat_hash_map<uint32_t, uint32_t>& acc) { + const uint32_t nbits = fp.nbits(); + + std::unique_ptr<uint32_t[]> bits = std::make_unique<uint32_t[]>(nbits); + + uint32_t bit; + int count; + int i = 0; + for (int ndx = 0; fp.next_bit_set(i, bit, count); ++ndx) { + bits[ndx] = bit; + ++acc[bit]; + } + + std::sort(bits.get(), bits.get() + nbits, [](uint32_t b1, uint32_t b2) { + return b1 < b2; + } + ); + + for (uint32_t i = 0; i < nbits; ++i) { + for (uint32_t j = i + 1; j < nbits; ++j) { + uint32_t bit = nbits * bits[i] + bits[j]; + ++acc[bit]; + } + } + + return 1; +} + +IWString +MakeTag(const IWString& stem, const char* extra) { + IWString result; + result << "NC" << stem << extra << '<'; + return result; +} + +int +CollectionData::Write(IWString_and_File_Descriptor& output) { + for (int i = 0; i < _nfixed; ++i) { + WriteFixed(_fixed[i], MakeTag(fixed_fingerprint_tag(i), ""), output); + output.write_if_buffer_holds_more_than(32768); + if (_collect_pairwise_fixed_bits) { + WriteFixed(_pairwise_fixed[i], MakeTag(fixed_fingerprint_tag(i), "P"), output); + output.write_if_buffer_holds_more_than(32768); + } + } + for (int i = 0; i < _nsparse; ++i) { + WriteSparse(_sparse[i], MakeTag(sparse_fingerprint_tag(i), ""), output); + output.write_if_buffer_holds_more_than(32768); + if (_collect_pairwise_sparse_bits) { + WriteSparse(_pairwise_sparse[i], MakeTag(sparse_fingerprint_tag(i), "p"), output); + output.write_if_buffer_holds_more_than(32768); + } + } + + return 1; +} + +int +CollectionData::WriteFixed(std::vector<uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output) { + switch (_scaling_type) { + case kLinear: + return LinearScalingFixed(data, tag, output); + case kLog10: + return LogarithmicScalingFixed(data, tag, output); + default: + cerr << "CollectionData::WriteFixed:unknown scaling type\n"; + return 0; + } +} + +int +CollectionData::LinearScalingFixed(std::vector<uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output) { + const uint32_t maxval = *std::max_element(data.cbegin(), data.cend()); + + Sparse_Fingerprint_Creator sfc; + + const uint32_t n = data.size(); + for (uint32_t i = 0; i < n; ++i) { + uint32_t count = data[i]; + if (count < _support) { + continue; + } + float c = static_cast<float>(count) / static_cast<float>(maxval) * 255.0f; + sfc.hit_bit(i, 1 + static_cast<int>(c + 0.4999f)); + } + + return sfc.write_fingerprint(tag, output); +} + +int +CollectionData::LogarithmicScalingFixed(std::vector<uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output) { + const uint32_t maxval = *std::max_element(data.cbegin(), data.cend()); + if (maxval == 0) { + return 0; + } + + const float fmax = std::log10(static_cast<float>(maxval)); + + const uint32_t n = data.size(); + + Sparse_Fingerprint_Creator sfc; + + for (uint32_t i = 0; i < n; ++i) { + uint32_t count = data[i]; + if (count < _support) { + continue; + } + // Add 1 so we do not get zero count values + float fcount = log10(count + 1); + + float c = fcount / fmax * 256.0f; + sfc.hit_bit(i, 1 + static_cast<int>(c + 0.4999f)); + } + + return sfc.write_fingerprint(tag, output); +} + +int +CollectionData::WriteSparse(const absl::flat_hash_map<uint32_t, uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output) { + switch(_scaling_type) { + case kLinear: + return LinearScalingSparse(data, tag, output); + case kLog10: + return Log10ScalingSparse(data, tag, output); + default: + cerr << "CollectionData::WriteSparse:unknown scaling type\n"; + return 0; + } + + return 1; // never happens +} + +// Return the max value in `data`. +uint32_t +MaxValue(const absl::flat_hash_map<uint32_t, uint32_t>& data) { + auto iter = std::max_element(data.begin(), data.end(), [](const auto &x, const auto &y) { + return x.second < y.second; + }); + + return iter->second; +} + +int +CollectionData::LinearScalingSparse(const absl::flat_hash_map<uint32_t, uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output) { + const uint32_t maxval = MaxValue(data); + + Sparse_Fingerprint_Creator sfc; + + for (const auto& [bit, count] : data) { + if (count < _support) { + continue; + } + + float c = static_cast<float>(count) / static_cast<float>(maxval) * 255.0; + sfc.hit_bit(bit, 1 + static_cast<int>(c + 0.4999f)); + } + + return sfc.write_fingerprint(tag, output); +} + +int +CollectionData::Log10ScalingSparse(const absl::flat_hash_map<uint32_t, uint32_t>& data, + const IWString& tag, + IWString_and_File_Descriptor& output) { + const uint32_t maxval = MaxValue(data); + float fmaxval = std::log10(static_cast<float>(maxval)); + + Sparse_Fingerprint_Creator sfc; + + for (const auto& [bit, count] : data) { + if (count < _support) { + continue; + } + + float c = std::log10(static_cast<float>(count)) / fmaxval * 255.0f; + sfc.hit_bit(bit, 1 + static_cast<int>(c + 0.4999f)); + } + + + return sfc.write_fingerprint(tag, output); +} + +int +ProfileCollection(IW_General_Fingerprint& fp, + CollectionData& data) { + return data.Profile(fp); +} + +int +ProfileCollection(iwstring_data_source& input, CollectionData& data) { + IW_TDT tdt; + while (tdt.next(input)) { + IW_General_Fingerprint fp; + int fatal; + if (! fp.construct_from_tdt(tdt, fatal)) { + if (fatal) { + return 0; + } + return 1; + } + + if (! ProfileCollection(fp, data)) { + return 0; + } + } + + return 1; +} + +int +ProfileCollection(const char* fname, CollectionData& data) { + iwstring_data_source input(fname); + if (! input.good()) { + cerr << "ProfileCollection::cannot open '" << fname << "'\n"; + return 0; + } + + return ProfileCollection(input, data); +} + +int +Main(int argc, char** argv) { + Command_Line cl(argc, argv, "vF:P:p:s:u:T:"); + if (cl.unrecognised_options_encountered()) { + cerr << "Unrecognised options encountered\n"; + Usage(1); + } + + CollectionData data; + + if (! data.Initialise(cl)) { + cerr << "Cannot initialise data collection options\n"; + Usage(1); + } + + if (cl.empty()) { + cerr << "Insufficient arguments\n"; + Usage(1); + } + + for (const char* fname : cl) { + if (! ProfileCollection(fname, data)) { + cerr << "Cannot process '" << fname << "'\n"; + return 1; + } + } + + IWString_and_File_Descriptor output(1); + + if (cl.option_present('T')) { + IWString title = cl.string_value('T'); + output << "PCN<" << title << ">\n"; + } + + data.Write(output); + output << "|\n"; + + return 0; +} + +} // namespace gfp_collection_fingerprint + +int +main(int argc, char **argv) { + int rc = gfp_collection_fingerprint::Main(argc, argv); + + return rc; +} diff --git a/src/Utilities/GFP_Tools/gfp_to_collection.cc b/src/Utilities/GFP_Tools/gfp_to_collection.cc new file mode 100644 index 00000000..251816a0 --- /dev/null +++ b/src/Utilities/GFP_Tools/gfp_to_collection.cc @@ -0,0 +1,286 @@ +// Generate a fingerprint that represents similarity to each of +// an external set of fingerprints. +// This is for the -SIM option to gfp_make. + +#include <iostream> +#include <memory> + +#include "Foundational/accumulator/accumulator.h" +#include "Foundational/cmdline/cmdline.h" +#include "Foundational/data_source/iwstring_data_source.h" +#include "Foundational/iw_tdt/iw_tdt.h" +#include "Foundational/iwmisc/sparse_fp_creator.h" + +#include "gfp.h" + +namespace gfp_to_collection { + +using std::cerr; + +void +Usage(int rc) { +// clang-format off +#if defined(GIT_HASH) && defined(TODAY) + cerr << __FILE__ << " compiled " << TODAY << " git hash " << GIT_HASH << '\n'; +#else + cerr << __FILE__ << " compiled " << __DATE__ << " " << __TIME__ << '\n'; +#endif + // clang-format on + // clang-format off + cerr << R"(Geneates fingerprint from similarity to a set of molecules. +The number of bits generated will be the number of items in the external set. + -C <fname> external file to which we compare. The fingerprints must match + -f function as a tDT filter + -v verbose output +)"; + + ::exit(rc); +} + +class Options { + private: + int _verbose; + + // The comparator fingerprints. + resizable_array_p<IW_General_Fingerprint> _pool; + + IWString _tag; + + int _fingerprints_processed; + + Accumulator<double> _acc; + + // private functions + int ReadPool(IWString& fname); + int ReadPool(iwstring_data_source& input); + + public: + Options(); + + int Initialise(Command_Line& cl); + + int Process(IW_General_Fingerprint& fp, IWString_and_File_Descriptor& output); + + int Report(std::ostream& output) const; +}; + +Options::Options() { + _verbose =0; + _tag = "NCSIM<"; + _fingerprints_processed = 0; +} + +int +Options::Initialise(Command_Line& cl) { + _verbose = cl.option_present('v'); + + if (! cl.option_present('C')) { + cerr << "Must specify comparator set of molecules via the -C option\n"; + return 0; + } + + if (cl.option_present('C')) { + IWString fname = cl.string_value('C'); + if (! ReadPool(fname)) { + cerr << "Cannot read comparator fingerprints '" << fname << "'\n"; + return 0; + } + + if (_verbose) { + cerr << "Read " << _pool.size() << " comparator fingerprints from '" << fname << "'\n"; + } + } + + if (cl.option_present('J')) { + cl.value('J', _tag); + if (! _tag.starts_with("NC")) { + cerr << "Tag must be non colliding form '" << _tag << "' invalid\n"; + return 0; + } + + if (! _tag.ends_with('<')) { + _tag << '<'; + } + + if (_verbose) { + cerr << "Will write tag '" << _tag << "'\n"; + } + } + + return 1; +} + +int +Options::ReadPool(IWString& fname) { + iwstring_data_source input(fname); + if (! input.good()) { + cerr << "Options::ReadPool:cannot open '" << fname << "'\n"; + return 0; + } + + return ReadPool(input); +} + +int +Options::ReadPool(iwstring_data_source& input) { + const int n = input.grep("^PCN<"); + if (n == 0) { + cerr << "Options::ReadPool:no fingerprints in input\n"; + return 0; + } + + _pool.resize(n); + + IW_TDT tdt; + while (tdt.next(input)) { + std::unique_ptr<IW_General_Fingerprint> fp = std::make_unique<IW_General_Fingerprint>(); + int fatal = 0; + if (fp->construct_from_tdt(tdt, fatal)) { + _pool << fp.release(); + } else if (fatal) { + return 0; + } + } + + if (_pool.empty()) { + cerr << "Options::ReadPool:pool is empty\n"; + return 0; + } + + return n; +} + +// Generate a sparse fingerprint based on the similarity of `fp` +// to everything in `_pool`, one bit per member of _pool. +// Write the resulting fingerprint to `output`. +int +Options::Process(IW_General_Fingerprint& fp, + IWString_and_File_Descriptor& output) { + ++_fingerprints_processed; + + Sparse_Fingerprint_Creator sfc; + + const int n = _pool.number_elements(); + for (int i = 0; i < n; ++i) { + float d = 1.0f - fp.tanimoto(*_pool[i]); + if (_verbose) { + _acc.extra(d); + } + int c = static_cast<int>(d * 254.0f + 0.4999f); + sfc.hit_bit(i, c + 1); + } + + return sfc.write_fingerprint(_tag, output); +} + +int +Options::Report(std::ostream& output) const { + output << "Read " << _fingerprints_processed << " fingerprints\n"; + if (_acc.n() == 0) { + return 1; + } + + output << "Distances btw " << _acc.minval() << " and " << + _acc.maxval() << " mean " << _acc.average() << '\n'; + return 1; +} + +int +GfpToCollection(Options& options, + IW_General_Fingerprint& fp, + IWString_and_File_Descriptor& output) { + return options.Process(fp, output); +} + +int +GfpToCollection(Options& options, + iwstring_data_source& input, + IWString_and_File_Descriptor& output) { + IW_TDT tdt; + while (tdt.next(input)) { + IW_General_Fingerprint fp; + int fatal = 0; + if (fp.construct_from_tdt(tdt, fatal)) { + // good + } else if (fatal) { + cerr << "GfpToCollection error reading TDT " << tdt << '\n'; + return 0; + } else { + return 1; + } + + tdt.write_all_except_vbar(output); + + if (! GfpToCollection(options, fp, output)) { + cerr << "Error processing " << tdt << '\n'; + return 0; + } + + output << "|\n"; + output.write_if_buffer_holds_more_than(8192); + } + + return 1; +} + +int +GfpToCollection(Options& options, + const char* fname, IWString_and_File_Descriptor& output) { + iwstring_data_source input(fname); + if (! input.good()) { + cerr << "GfpToCollection:Cannot open '" << fname << "'\n"; + return 0; + } + + return GfpToCollection(options, input, output); +} + +int +Main(int argc, char** argv) { + Command_Line cl(argc, argv, "vF:P:C:J:"); + + if (cl.unrecognised_options_encountered()) { + cerr << "Unrecognised options encountered\n"; + Usage(1); + } + + const int verbose = cl.option_count('v'); + + Options options; + if (! options.Initialise(cl)) { + cerr << "Cannot initialise\n"; + return 1; + } + + if (cl.empty()) { + cerr << "Insufficient arguments\n"; + Usage(1); + } + + IWString_and_File_Descriptor output(1); + if (cl.option_present('f')) { + GfpToCollection(options, cl[0], output); + } else { + for (const char* fname: cl) { + if (! GfpToCollection(options, fname, output)) { + cerr << "Error processing '" << fname << "'\n"; + return 1; + } + } + } + + if (verbose) { + options.Report(cerr); + } + + return 0; +} + +} // namespace gfp_to_collection + +int +main(int argc, char **argv) { + int rc = gfp_to_collection::Main(argc, argv); + + return rc; +} diff --git a/src/Utilities/GFP_Tools/iwstats.cc b/src/Utilities/GFP_Tools/iwstats.cc index e974d36a..2e0880ea 100644 --- a/src/Utilities/GFP_Tools/iwstats.cc +++ b/src/Utilities/GFP_Tools/iwstats.cc @@ -1,17 +1,14 @@ /* - Tester for Bsquared + Compute summary statistics between experimental and predicted numeric values. */ #include <algorithm> #include <cmath> -#include <memory> #include <iostream> #include <limits> +#include <memory> #include <random> -using std::cerr; -using std::endl; -//#include "iwmalloc.h" #define RESIZABLE_ARRAY_IMPLEMENTATION #define RESIZABLE_ARRAY_IWQSORT_IMPLEMENTATION #include "Foundational/accumulator/accumulator.h" @@ -21,13 +18,12 @@ using std::endl; #include "Foundational/iwqsort/iwqsort.h" #include "Foundational/iwstring/iw_stl_hash_map.h" -#include "bsquared.h" - #include "Metric.h" +#include "bsquared.h" +using std::cerr; using std::cout; using std::endl; -using std::cerr; static Enrichment enrichment; @@ -111,51 +107,55 @@ static resizable_array<float> fold_difference_multiplicative; static IWString_and_File_Descriptor stream_for_residuals; static void -usage (int rc) -{ +usage(int rc) { // clang-format off #if defined(GIT_HASH) && defined(TODAY) cerr << __FILE__ << " compiled " << TODAY << " git hash " << GIT_HASH << '\n'; #else cerr << __FILE__ << " compiled " << __DATE__ << " " << __TIME__ << '\n'; #endif -// clang-format on - cerr << "Computes Bsquared and other statistics - allows missing values\n"; - cerr << " -e <col> column for experimental (measured) values\n"; - cerr << " -E <file> activities are in a different file <file>\n"; - cerr << " -z strip leading 0's from identifiers when using -E\n"; - cerr << " -p <col> column for predicted values\n"; - cerr << " -s <number> skip <number> records at the top of each file\n"; - cerr << " -n <number> process only the first/best <number> records\n"; - cerr << " -t <number> compute Bsquared for sections of the data. For example,\n"; - cerr << " -t 10 would report values for the first/best 10, 20, 30 values\n"; - cerr << " -P <number> sample the first/best <number> percent of the data\n"; -//cerr << " -A <float> sample activities above <float>\n"; - cerr << " -j treat as a descriptor file\n"; - cerr << " -M <string> missing value string\n"; - cerr << " -q quietly ignore missing values\n"; - cerr << " -R . randomise the sort when duplicate predicted values present\n"; - cerr << " -c <number> number of valid pairs needed for producing correlations (default " << values_needed_for_reporting_correlations << ")\n"; - cerr << " -w when duplicate values present, suppress computation of best\n"; - cerr << " and worst BSquared values\n"; - cerr << " -r <float> max relative error allowed computations\n"; - cerr << " -T truncate predicted values to the experimental range\n"; - cerr << " -h use traditional Q2 formula\n"; - cerr << " -b <nbucket> compute distribution functions across <nbucket> buckets\n"; - cerr << " -F <f> calculate number of predictions outside <f> fold of experimental (multiplicative)\n"; - cerr << " -D <f> calculate number of predictions differing by <d> from experimental (additive)\n"; - cerr << " -k just skip predicted values that have no experimental value (repeat for quiet)\n"; - cerr << " -d compute Dave's cMSD rather than cMSR\n"; - cerr << " -o <float> cutoff for active/inactive (for enrichment metrics BEDROC EF ...)\n"; - cerr << " -a <float> BEDROC alpha value (default " << bedroc_alpha << ")\n"; - cerr << " -f <float> Enrichment Factor default fraction (default " << enrichment_factor_fraction << ")\n"; - cerr << " -u <float> discard experimental values below <float> - useful for studying actives only \n"; - cerr << " -U <fraction> keep only the <fraction> most active experimental values\n"; - cerr << " -m <col/name> do analysis by data in column <col> or descriptor name <name>\n"; - cerr << " -L <fname> write residuals to <fname>\n"; - cerr << " -v verbose output\n"; - - exit (rc); + // clang-format on + // clang-format off + cerr << R"(Computes Bsquared and other summary statistics - allows missing values +Compares an experimental set of values (-E,-e) with one more predicted sets of values (-p) +generating summary statistics between the sets of numbers. +Can have the experimental data in a separate file, or as a column in the predicted file. + -E <file> activities are in a different file <file> + -e <col> column for experimental (measured) values - either + -z strip leading 0's from identifiers when using -E + -p <col> column for predicted values - can specify any number + -s <number> skip <number> records at the top of each file + -j treat as a descriptor file + -n <number> process only the first/best <number> records + -t <number> compute Bsquared for sections of the data. For example, + -t 10 would report values for the first/best 10, 20, 30 values + -P <number> sample the first/best <number> percent of the data + -M <string> missing value string + -q quietly ignore missing values + -R . randomise the sort when duplicate predicted values present + -c <number> number of valid pairs needed for producing correlations (default " << values_needed_for_reporting_correlations << ") + -w when duplicate values present, suppress computation of best + and worst BSquared values + -r <float> max relative error allowed computations + -T truncate predicted values to the experimental range + -h use traditional (Wikipedia) Q2 formula + -b <nbucket> compute distribution functions across <nbucket> buckets + -F <f> calculate number of predictions outside <f> fold of experimental (multiplicative) + -D <f> calculate number of predictions differing by <d> from experimental (additive) + -k just skip predicted values that have no experimental value (repeat for quiet) + -d compute Dave's cMSD rather than cMSR + -o <float> cutoff for active/inactive (for enrichment metrics BEDROC EF ...) + -a <float> BEDROC alpha value (default " << bedroc_alpha << ") + -f <float> Enrichment Factor default fraction (default " << enrichment_factor_fraction << ") + -u <float> discard experimental values below <float> - useful for studying actives only + -U <fraction> keep only the <fraction> most active experimental values + -m <col/name> do analysis by data in column <col> or descriptor name <name> + -L <fname> write residuals to <fname> + -v verbose output +)"; + // clang-format on + + exit(rc); } static int verbose = 0; @@ -184,7 +184,7 @@ static int is_descriptor_file = 0; static int columns_in_input = 0; -static IWString * column_titles = nullptr; +static IWString* column_titles = nullptr; /* Since Bsquared can vary depending on the input order, we can do various things... @@ -196,13 +196,12 @@ static int number_distribution_buckets = 0; template <typename T> T -median (const T * v, - int n) -{ - if (n == (n/2*2)) // N is even, take ave of two in middle - return 0.5*(v[n/2-1] + v[n/2]); - else - return v[n/2]; +median(const T* v, int n) { + if (n == (n / 2 * 2)) { // N is even, take ave of two in middle + return 0.5 * (v[n / 2 - 1] + v[n / 2]); + } else { + return v[n / 2]; + } } /* @@ -217,15 +216,16 @@ static IWString global_prefix; template <typename T> void -write_something_identifying_the_column (int zcol, T & output) -{ - if (global_prefix.length() > 0) +write_something_identifying_the_column(int zcol, T& output) { + if (global_prefix.length() > 0) { output << global_prefix; + } - if (is_descriptor_file) + if (is_descriptor_file) { output << ' ' << column_titles[zcol]; - else if (zcol >= 0) + } else if (zcol >= 0) { output << " column " << (zcol + 1); + } return; } @@ -236,66 +236,67 @@ write_something_identifying_the_column (int zcol, T & output) */ static int -establish_column_titles (const const_IWSubstring & buffer, - int experimental_column, - const resizable_array<int> & predicted_column, - int & marker_column, - const IWString & marker_column_name) -{ - if (nullptr != column_titles) - delete [] column_titles; +establish_column_titles(const const_IWSubstring& buffer, int experimental_column, + const resizable_array<int>& predicted_column, int& marker_column, + const IWString& marker_column_name) { + if (nullptr != column_titles) { + delete[] column_titles; + } columns_in_input = buffer.nwords(input_separator); - if (0 == columns_in_input) - { + if (0 == columns_in_input) { cerr << "Huh, no tokens in descriptor file header\n"; return 0; } - if (experimental_column >= columns_in_input) - { - cerr << "Invalid experimental column " << experimental_column << " only " << columns_in_input << " columns in input\n"; + if (experimental_column >= columns_in_input) { + cerr << "Invalid experimental column " << experimental_column << " only " + << columns_in_input << " columns in input\n"; return 0; } - for (int i = 0; i < predicted_column.number_elements(); i++) - { + for (int i = 0; i < predicted_column.number_elements(); i++) { int p = predicted_column[i]; - if (p >= columns_in_input) - { - cerr << "Invalid predicted value column " << p << " only " << columns_in_input << " columns in input\n"; + if (p >= columns_in_input) { + cerr << "Invalid predicted value column " << p << " only " << columns_in_input + << " columns in input\n"; return 0; } } - if (! is_descriptor_file) + if (!is_descriptor_file) { return 1; + } column_titles = new IWString[columns_in_input]; int col = 0; int i = 0; const_IWSubstring token; - while (buffer.nextword(token, i, input_separator)) - { + while (buffer.nextword(token, i, input_separator)) { column_titles[col] = token; - if (col == experimental_column && id_activity_hash.empty()) // expt column doesn't really mean the same thing when just a name cross reference + // expt column doesn't really mean the same thing when just a name cross reference. + if (col == experimental_column && id_activity_hash.empty()) { cerr << "Experimental column is '" << column_titles[col] << "'\n"; + } - if (marker_column_name.length() > 0 && marker_column < 0 && token == marker_column_name) - { + if (marker_column_name.length() > 0 && marker_column < 0 && + token == marker_column_name) { marker_column = col; - if (verbose) - cerr << "Found marker descriptor '" << marker_column_name << "' in column " << (col+1) << endl; + if (verbose) { + cerr << "Found marker descriptor '" << marker_column_name << "' in column " + << (col + 1) << '\n'; + } } col++; } - if (experimental_column >= 0 && 0 == activity_name.length()) + if (experimental_column >= 0 && 0 == activity_name.length()) { activity_name = column_titles[experimental_column]; + } return 1; } @@ -306,81 +307,97 @@ establish_column_titles (const const_IWSubstring & buffer, typedef float experimental_value_t; -class Predicted_Values -{ - private: - experimental_value_t _experimental; +class Predicted_Values { + private: + experimental_value_t _experimental; -// to account for missing values, we mark each value as valid or not + // to account for missing values, we mark each value as valid or not - int * _valid; - experimental_value_t * _predicted; + int* _valid; + experimental_value_t* _predicted; -// when doing randomised breaking of ties, we need a random number with each prediction + // when doing randomised breaking of ties, we need a random number with each prediction - experimental_value_t _random; + experimental_value_t _random; - IWString _marker; + IWString _marker; - public: - Predicted_Values(); - ~Predicted_Values(); + public: + Predicted_Values(); + ~Predicted_Values(); - int debug_print (std::ostream &) const; + int debug_print(std::ostream&) const; - experimental_value_t obs() const { return _experimental;} - experimental_value_t pred (int c) const { return _predicted[c];} - int valid(int i) const { return _valid[i];} + experimental_value_t + obs() const { + return _experimental; + } - experimental_value_t random_value() const { return _random;} - void assign_random_value(experimental_value_t r) { - _random = r; - } + experimental_value_t + pred(int c) const { + return _predicted[c]; + } + + int + valid(int i) const { + return _valid[i]; + } + + experimental_value_t + random_value() const { + return _random; + } + + void + assign_random_value(experimental_value_t r) { + _random = r; + } - const IWString marker() const { return _marker;} + const IWString + marker() const { + return _marker; + } - int parse_buffer (const const_IWSubstring & buffer, - int experimental_column, - const resizable_array<int> & predicted_column, - int marker_column, - int & fatal); + int parse_buffer(const const_IWSubstring& buffer, int experimental_column, + const resizable_array<int>& predicted_column, int marker_column, + int& fatal); }; -Predicted_Values::Predicted_Values() -{ - assert (columns_in_input > 0); +Predicted_Values::Predicted_Values() { + assert(columns_in_input > 0); _experimental = 0.0; _valid = new_int(columns_in_input); _predicted = new experimental_value_t[columns_in_input]; - _random = static_cast<experimental_value_t> (0.0); + _random = static_cast<experimental_value_t>(0.0); return; } -Predicted_Values::~Predicted_Values() -{ - if (nullptr != _valid) - delete [] _valid; +Predicted_Values::~Predicted_Values() { + if (nullptr != _valid) { + delete[] _valid; + } - if (nullptr != _predicted) - delete [] _predicted; + if (nullptr != _predicted) { + delete[] _predicted; + } return; } static int -fetch_activity (const IW_STL_Hash_Map<IWString, IWString> & id_activity_hash, - IWString & s) -{ - if (strip_leading_zeros_from_identifiers) +fetch_activity(const IW_STL_Hash_Map<IWString, IWString>& id_activity_hash, IWString& s) { + if (strip_leading_zeros_from_identifiers) { s.remove_leading_chars('0'); + } IW_STL_Hash_Map<IWString, IWString>::const_iterator f = id_activity_hash.find(s); - if (f == id_activity_hash.end()) + if (f == id_activity_hash.end()) { return 0; + } s = (*f).second; @@ -388,79 +405,70 @@ fetch_activity (const IW_STL_Hash_Map<IWString, IWString> & id_activity_hash, } int -Predicted_Values::parse_buffer (const const_IWSubstring & buffer, - int experimental_column, - const resizable_array<int> & predicted_column, - int marker_column, - int & fatal) -{ +Predicted_Values::parse_buffer(const const_IWSubstring& buffer, int experimental_column, + const resizable_array<int>& predicted_column, + int marker_column, int& fatal) { int i = 0; IWString token; int col = 0; - while (buffer.nextword(token, i, input_separator)) - { + while (buffer.nextword(token, i, input_separator)) { int prediction_index = -1; - if (col == experimental_column) - { - if (id_activity_hash.size()) - { - if (! fetch_activity(id_activity_hash, token)) - { + if (col == experimental_column) { + if (id_activity_hash.size()) { + if (!fetch_activity(id_activity_hash, token)) { items_with_no_activity_data++; - if (skip_items_with_no_activity_data) + if (skip_items_with_no_activity_data) { fatal = 0; - else + } else { fatal = 1; + } - if (skip_items_with_no_activity_data < 2) + if (skip_items_with_no_activity_data < 2) { cerr << "Cannot find activity data for '" << token << "'\n"; + } return 0; } } - } - else if (col == marker_column) - { + } else if (col == marker_column) { _marker = token; col++; continue; - } - else if ((prediction_index = predicted_column.index(col)) >= 0) + } else if ((prediction_index = predicted_column.index(col)) >= 0) { ; - else - { + } else { col++; continue; } - if (missing_value.length() && missing_value == token) - { - if (report_missing_values) - cerr << "Ignoring missing value in column " << (col + 1) << endl; + if (missing_value.length() && missing_value == token) { + if (report_missing_values) { + cerr << "Ignoring missing value in column " << (col + 1) << '\n'; + } missing_values_encountered++; col++; continue; } double v; - if (! token.numeric_value(v)) // great + if (!token.numeric_value(v)) // great { cerr << "Invalid numeric value '" << token << "'\n"; - if (col == experimental_column && id_activity_hash.size() > 0) + if (col == experimental_column && id_activity_hash.size() > 0) { cerr << "Error is in activity file\n"; - else - cerr << buffer << endl; + } else { + cerr << buffer << '\n'; + } fatal = 1; return 0; } - if (col == experimental_column) + if (col == experimental_column) { _experimental = v; - else - { + } else { _valid[prediction_index] = 1; _predicted[prediction_index] = v; } @@ -468,9 +476,9 @@ Predicted_Values::parse_buffer (const const_IWSubstring & buffer, col++; } - if (col != columns_in_input) - { - cerr << "Column count mismatch, found " << col << " columns, expected " << columns_in_input << endl; + if (col != columns_in_input) { + cerr << "Column count mismatch, found " << col << " columns, expected " + << columns_in_input << '\n'; fatal = 1; return 0; } @@ -479,18 +487,16 @@ Predicted_Values::parse_buffer (const const_IWSubstring & buffer, } int -Predicted_Values::debug_print (std::ostream & os) const -{ +Predicted_Values::debug_print(std::ostream& os) const { os << "expt: " << _experimental; - if (nullptr != _predicted) - { + if (nullptr != _predicted) { os << " pred:"; - for (int i = 0; i < columns_in_input; i++) - { - if (_valid[i]) + for (int i = 0; i < columns_in_input; i++) { + if (_valid[i]) { os << ' ' << _predicted[i]; - else + } else { os << " *"; + } } } @@ -500,26 +506,25 @@ Predicted_Values::debug_print (std::ostream & os) const } template class resizable_array_p<Predicted_Values>; -template class resizable_array_base<Predicted_Values *>; +template class resizable_array_base<Predicted_Values*>; /* Are there any duplicate predicted values? */ -static int -duplicate_predicted_values (const resizable_array_p<Predicted_Values> & zdata, - int predicted_column) -{ +static int +duplicate_predicted_values(const resizable_array_p<Predicted_Values>& zdata, + int predicted_column) { experimental_value_t predprev = zdata[0]->pred(predicted_column); int n = zdata.number_elements(); - for (int i = 1; i < n; i++) - { + for (int i = 1; i < n; i++) { experimental_value_t pred = zdata[i]->pred(predicted_column); - if (pred == predprev) + if (pred == predprev) { return 1; + } predprev = pred; } @@ -533,20 +538,17 @@ duplicate_predicted_values (const resizable_array_p<Predicted_Values> & zdata, */ static int -determine_numbers_to_check_by_activity(const resizable_array_p<Predicted_Values> & zdata, - resizable_array<int> & numbers_to_check) -{ +determine_numbers_to_check_by_activity(const resizable_array_p<Predicted_Values>& zdata, + resizable_array<int>& numbers_to_check) { #ifdef NOT_IMPLEMENTED int n = zdata.number_elements(); - for (int i = 0; i < activities_to_check.number_elements(); i++) - { + for (int i = 0; i < activities_to_check.number_elements(); i++) { float a = activities_to_check[i]; int nsample = 0; - for (int i = 0; i < n; i++) - { + for (int i = 0; i < n; i++) { } } #endif @@ -561,76 +563,66 @@ determine_numbers_to_check_by_activity(const resizable_array_p<Predicted_Values> a percentage */ -static int -determine_numbers_to_check (resizable_array<int> & numbers_to_check, - int records_read) -{ +static int +determine_numbers_to_check(resizable_array<int>& numbers_to_check, int records_read) { numbers_to_check.resize_keep_storage(0); chunk_titles.resize_keep_storage(0); - if (step > 0) - { - if (step > records_read) - { + if (step > 0) { + if (step > records_read) { cerr << "Only read " << records_read << " records, step " << step << " too large\n"; - } - else - { - for (int i = step; i <= records_read; i += step) - { + } else { + for (int i = step; i <= records_read; i += step) { numbers_to_check.add(i); - IWString * tmp = new IWString; + IWString* tmp = new IWString; tmp->append_number(i); - tmp->operator+= (" observations"); + tmp->operator+=(" observations"); chunk_titles.add(tmp); } } } - if (percents_to_check.number_elements()) - { - for (int i = 0; i < percents_to_check.number_elements(); i++) - { + if (percents_to_check.number_elements()) { + for (int i = 0; i < percents_to_check.number_elements(); i++) { int p = percents_to_check[i]; - int n = int(static_cast<float>(p * records_read) / 99.999); // use a number < 100 to give a result just larger than the likely integer + // use a number < 100 to give a result just larger than the likely integer + int n = int(static_cast<float>(p * records_read) / 99.999); - if (n > 1 && n <= records_read) - { - if (verbose > 1) + if (n > 1 && n <= records_read) { + if (verbose > 1) { cerr << p << " percent is " << n << " observations\n"; + } numbers_to_check.add(n); - IWString * tmp = new IWString; + IWString* tmp = new IWString; tmp->append_number(p); - tmp->operator+= ("% observations"); + tmp->operator+=("% observations"); chunk_titles.add(tmp); - } - else if (n <= 1) - cerr << p << " percent of " << records_read << " is " << n << " which is ignored\n"; - else + } else if (n <= 1) { + cerr << p << " percent of " << records_read << " is " << n + << " which is ignored\n"; + } else { cerr << "What am I supposed to do with " << n << " records\n"; + } } } - if (N_to_check.number_elements()) - { - for (int i = 0; i < N_to_check.number_elements(); i++) - { + if (N_to_check.number_elements()) { + for (int i = 0; i < N_to_check.number_elements(); i++) { int n = N_to_check[i]; - if (n < 2 || n > records_read) - { - cerr << "Skipping invalid number of records to check " << n << endl; + if (n < 2 || n > records_read) { + cerr << "Skipping invalid number of records to check " << n << '\n'; continue; } numbers_to_check.add(n); - IWString * tmp = new IWString; + IWString* tmp = new IWString; tmp->append_number(n); - tmp->operator+= (" observations"); + tmp->operator+=(" observations"); chunk_titles.add(tmp); } @@ -639,157 +631,157 @@ determine_numbers_to_check (resizable_array<int> & numbers_to_check, return numbers_to_check.number_elements(); } -class Predicted_Value_Comparitor -{ - protected: - int _predicted_column; +class Predicted_Value_Comparitor { + protected: + int _predicted_column; - public: - Predicted_Value_Comparitor (int p) : _predicted_column (p) {} + public: + Predicted_Value_Comparitor(int p) : _predicted_column(p) { + } - int operator() (const Predicted_Values *, const Predicted_Values *); + int operator()(const Predicted_Values*, const Predicted_Values*); }; int -Predicted_Value_Comparitor::operator() (const Predicted_Values * pv1, - const Predicted_Values * pv2) -{ +Predicted_Value_Comparitor::operator()(const Predicted_Values* pv1, + const Predicted_Values* pv2) { experimental_value_t p1 = pv1->pred(_predicted_column); experimental_value_t p2 = pv2->pred(_predicted_column); -//cerr << "Comparing " << p1 << " with " << p2 << endl; + // cerr << "Comparing " << p1 << " with " << p2 << '\n'; - if (p1 > p2) + if (p1 > p2) { return -1; + } - if (p1 < p2) + if (p1 < p2) { return 1; + } - if (randomise_ties) - { + if (randomise_ties) { p1 = pv1->random_value(); p2 = pv2->random_value(); - if (p1 > p2) + if (p1 > p2) { return -1; - if (p1 < p2) + } + if (p1 < p2) { return 1; + } } return 0; } -class Predicted_Value_Comparitor_Best : public Predicted_Value_Comparitor -{ - private: - - public: - Predicted_Value_Comparitor_Best (int p) : Predicted_Value_Comparitor (p) {}; +class Predicted_Value_Comparitor_Best : public Predicted_Value_Comparitor { + private: + public: + Predicted_Value_Comparitor_Best(int p) : Predicted_Value_Comparitor(p){}; - int operator() (const Predicted_Values *, const Predicted_Values *); + int operator()(const Predicted_Values*, const Predicted_Values*); }; int -Predicted_Value_Comparitor_Best::operator() (const Predicted_Values * pv1, - const Predicted_Values * pv2) -{ +Predicted_Value_Comparitor_Best::operator()(const Predicted_Values* pv1, + const Predicted_Values* pv2) { experimental_value_t p1 = pv1->pred(_predicted_column); experimental_value_t p2 = pv2->pred(_predicted_column); - if (p1 > p2) + if (p1 > p2) { return -1; + } - if (p1 < p2) + if (p1 < p2) { return 1; + } experimental_value_t e1 = pv1->obs(); experimental_value_t e2 = pv2->obs(); - if (e1 > e2) + if (e1 > e2) { return -1; + } - if (e1 < e2) + if (e1 < e2) { return 1; + } return 0; } -class Predicted_Value_Comparitor_Worst : public Predicted_Value_Comparitor -{ - private: - public: - Predicted_Value_Comparitor_Worst (int p) : Predicted_Value_Comparitor (p) {}; +class Predicted_Value_Comparitor_Worst : public Predicted_Value_Comparitor { + private: + public: + Predicted_Value_Comparitor_Worst(int p) : Predicted_Value_Comparitor(p){}; - int operator() (const Predicted_Values *, const Predicted_Values *); + int operator()(const Predicted_Values*, const Predicted_Values*); }; int -Predicted_Value_Comparitor_Worst::operator() (const Predicted_Values * pv1, - const Predicted_Values * pv2) -{ +Predicted_Value_Comparitor_Worst::operator()(const Predicted_Values* pv1, + const Predicted_Values* pv2) { experimental_value_t p1 = pv1->pred(_predicted_column); experimental_value_t p2 = pv2->pred(_predicted_column); - if (p1 > p2) + if (p1 > p2) { return -1; + } - if (p1 < p2) + if (p1 < p2) { return 1; + } experimental_value_t e1 = pv1->obs(); experimental_value_t e2 = pv2->obs(); - if (e1 > e2) + if (e1 > e2) { return 1; + } - if (e1 < e2) + if (e1 < e2) { return -1; + } return 0; } -class Float_Comparator -{ - private: - public: - int operator () (const float & f1, const float & f2) const; +class Float_Comparator { + private: + public: + int operator()(const float& f1, const float& f2) const; }; int -Float_Comparator::operator() (const float & f1, - const float & f2) const -{ - if (f1 < f2) +Float_Comparator::operator()(const float& f1, const float& f2) const { + if (f1 < f2) { return -1; + } - if (f1 > f2) + if (f1 > f2) { return 1; + } return 0; } static int -compute_distribution_function (int number_records, - const float * v, - const float minval, - const float maxval, - int * d) -{ - if (minval >= maxval) - { - cerr << "compute_distribution_function:unsorted or no variability: minval " << minval << ", maxval " << maxval << endl; +compute_distribution_function(int number_records, const float* v, const float minval, + const float maxval, int* d) { + if (minval >= maxval) { + cerr << "compute_distribution_function:unsorted or no variability: minval " << minval + << ", maxval " << maxval << '\n'; return 0; } float delta = (maxval - minval) / static_cast<float>(number_distribution_buckets); - for (int i = 0; i < number_records; i++) - { + for (int i = 0; i < number_records; i++) { int j = static_cast<int>((v[i] - minval) / delta + 0.49999); -// cerr << "Bucket " << j << " max " << number_distribution_buckets << endl; - if (j >= number_distribution_buckets) + // cerr << "Bucket " << j << " max " << number_distribution_buckets << '\n'; + if (j >= number_distribution_buckets) { j = number_distribution_buckets - 1; - else if (j < 0) + } else if (j < 0) { j = 0; + } d[j]++; } @@ -797,15 +789,12 @@ compute_distribution_function (int number_records, return 1; } -static int write_distribution_function (const char * prefix, - int number_records, - const int * d, - std::ostream & output) -{ +static int +write_distribution_function(const char* prefix, int number_records, const int* d, + std::ostream& output) { output << prefix; - for (int i = 0; i < number_distribution_buckets; i++) - { + for (int i = 0; i < number_distribution_buckets; i++) { float f = d[i] / static_cast<float>(number_records); output << ' ' << f; } @@ -816,74 +805,72 @@ static int write_distribution_function (const char * prefix, } static int -do_compute_distribution_functions(int number_records, - int which_predicted_set, - int predicted_column, - int experimental_column, - float * tmp1, - float * tmp2, - const resizable_array_p<Predicted_Values> & zdata, - std::ostream & output) -{ - assert (experimental_column >= 0); - assert (number_distribution_buckets > 1); +do_compute_distribution_functions(int number_records, int which_predicted_set, + int predicted_column, int experimental_column, + float* tmp1, float* tmp2, + const resizable_array_p<Predicted_Values>& zdata, + std::ostream& output) { + assert(experimental_column >= 0); + assert(number_distribution_buckets > 1); float min_expt, max_expt, min_pred, max_pred; - max_pred = 0.0f; // keep compiler quiet - min_pred = 0.0f; // keep compiler quiet - min_expt = 0.0f; // keep compiler quiet - max_expt = 0.0f; // keep compiler quiet + max_pred = 0.0f; // keep compiler quiet + min_pred = 0.0f; // keep compiler quiet + min_expt = 0.0f; // keep compiler quiet + max_expt = 0.0f; // keep compiler quiet - float obs, pred; // scope here for efficiency + float obs, pred; // scope here for efficiency - for (int i = 0; i < number_records; i++) - { - const Predicted_Values & pvi = *(zdata[i]); + for (int i = 0; i < number_records; i++) { + const Predicted_Values& pvi = *(zdata[i]); obs = pvi.obs(); pred = pvi.pred(which_predicted_set); - if (0 == i) - { + if (0 == i) { min_expt = obs; max_expt = obs; min_pred = pred; max_pred = pred; - } - else - { - if (obs < min_expt) + } else { + if (obs < min_expt) { min_expt = obs; - else if (obs > max_expt) + } else if (obs > max_expt) { max_expt = obs; + } - if (pred < min_pred) + if (pred < min_pred) { min_pred = pred; - else if (pred > max_pred) + } else if (pred > max_pred) { max_pred = pred; + } } tmp2[i] = pred; tmp1[i] = obs; -// cerr << " i = " << i << " obs " << obs << " pred " << pred << endl; + // cerr << " i = " << i << " obs " << obs << " pred " << pred << '\n'; } -//cerr << "min obs " << min_expt << " max obs " << max_expt << " min pred " << min_pred << " max pred " << max_pred << endl; + // cerr << "min obs " << min_expt << " max obs " << max_expt << " min pred " << min_pred + // << " max pred " << max_pred << '\n'; - int * d1 = new_int(number_distribution_buckets); std::unique_ptr<int> free_d1(d1); - int * d2 = new_int(number_distribution_buckets); std::unique_ptr<int> free_d2(d2); + int* d1 = new_int(number_distribution_buckets); + std::unique_ptr<int> free_d1(d1); + int* d2 = new_int(number_distribution_buckets); + std::unique_ptr<int> free_d2(d2); - -//cerr << "Computing experimental distribution function\n"; - if (! compute_distribution_function(number_records, tmp1, min_expt, max_expt, d1)) + // cerr << "Computing experimental distribution function\n"; + if (!compute_distribution_function(number_records, tmp1, min_expt, max_expt, d1)) { return 0; + } -//cerr << "Computing predicted distribution function\n"; - if (! compute_distribution_function(number_records, tmp2, min_pred, max_pred, d2)) + // cerr << "Computing predicted distribution function\n"; + if (!compute_distribution_function(number_records, tmp2, min_pred, max_pred, d2)) { return 0; + } write_distribution_function("Dexpt:", number_records, d1, output); write_distribution_function("Dpred:", number_records, d2, output); @@ -891,174 +878,159 @@ do_compute_distribution_functions(int number_records, output << "Compare:"; float sum = static_cast<float>(0.0); - for (int i = 0; i < number_distribution_buckets; i++) - { - if (0 == d1[i]) - { + for (int i = 0; i < number_distribution_buckets; i++) { + if (0 == d1[i]) { output << " 0"; continue; } float t = static_cast<float>(d2[i]) / static_cast<float>(d1[i]); output << ' ' << t; - if (d1[i] < d2[i]) + if (d1[i] < d2[i]) { sum += 1.0 / t; - else + } else { sum += t; + } } output << '\n'; - output << "Distributional similarity " << sum / static_cast<float>(number_distribution_buckets) << '\n'; + output << "Distributional similarity " + << sum / static_cast<float>(number_distribution_buckets) << '\n'; return output.good(); } -static int -initilize_enrichment (int number_records, - int experimental_column, - const resizable_array_p<Predicted_Values> & zdata, - float * tmp1, - int which_predicted_set) -{ +static int +initilize_enrichment(int number_records, int experimental_column, + const resizable_array_p<Predicted_Values>& zdata, float* tmp1, + int which_predicted_set) { int n = 0; - if (experimental_column >= 0) - { - for (int i = 0; i < number_records; i++) - { - const Predicted_Values & pvi = *(zdata[i]); + if (experimental_column >= 0) { + for (int i = 0; i < number_records; i++) { + const Predicted_Values& pvi = *(zdata[i]); - if (! pvi.valid(which_predicted_set)) + if (!pvi.valid(which_predicted_set)) { continue; + } tmp1[n] = pvi.obs(); n++; } - return enrichment.buildFromSortedArray(tmp1,n,active_inactive_cutoff); - } - else - { + return enrichment.buildFromSortedArray(tmp1, n, active_inactive_cutoff); + } else { return 0; } - } - - static int -compute_b_squared (int number_records, - int experimental_column, - const resizable_array_p<Predicted_Values> & zdata, - float * tmp1, - float * tmp2, - double & bsquared, - int which_predicted_set) -{ +compute_b_squared(int number_records, int experimental_column, + const resizable_array_p<Predicted_Values>& zdata, float* tmp1, + float* tmp2, double& bsquared, int which_predicted_set) { int n = 0; - if (experimental_column >= 0) - { - for (int i = 0; i < number_records; i++) - { - const Predicted_Values & pvi = *(zdata[i]); + if (experimental_column >= 0) { + for (int i = 0; i < number_records; i++) { + const Predicted_Values& pvi = *(zdata[i]); - if (! pvi.valid(which_predicted_set)) + if (!pvi.valid(which_predicted_set)) { continue; + } - if (pvi.obs() < discard_measured_values_below) + if (pvi.obs() < discard_measured_values_below) { continue; + } tmp1[n] = pvi.obs(); n++; } - } - else - { + } else { set_vector(tmp1, number_records, static_cast<float>(0.0)); n = number_records; } -//#define CHECK_BSQUARED_COMPUTATION +// #define CHECK_BSQUARED_COMPUTATION #ifdef CHECK_BSQUARED_COMPUTATION double check; compute_b_squared(tmp1, tmp2, n, check); - cerr << "N = " << n << ", whole set Bsquared " << check << endl; + cerr << "N = " << n << ", whole set Bsquared " << check << '\n'; #endif -//cerr << "From " << number_records << " found " << n << " values for B2\n"; + // cerr << "From " << number_records << " found " << n << " values for B2\n"; return compute_b_squared(tmp1, tmp2, n, bsquared); } static int -gather_markers (const resizable_array_p<Predicted_Values> & zdata, - IW_STL_Hash_Map_int & markers_present) -{ +gather_markers(const resizable_array_p<Predicted_Values>& zdata, + IW_STL_Hash_Map_int& markers_present) { const auto n = zdata.number_elements(); - for (auto i = 0; i < n; ++i) - { - const IWString & s = zdata[i]->marker(); + for (auto i = 0; i < n; ++i) { + const IWString& s = zdata[i]->marker(); auto f = markers_present.find(s); - if (f == markers_present.end()) + if (f == markers_present.end()) { markers_present[s] = 1; - else + } else { (*f).second++; + } } - if (verbose) - cerr << "Across " << n << " records found " << markers_present.size() << " unique markers\n"; + if (verbose) { + cerr << "Across " << n << " records found " << markers_present.size() + << " unique markers\n"; + } return markers_present.size(); } static int -read_the_data (iwstring_data_source & input, - int experimental_column, - const resizable_array<int> & predicted_column, - int & marker_column, - const IWString & marker_column_name, - resizable_array_p<Predicted_Values> & zdata) -{ +read_the_data(iwstring_data_source& input, int experimental_column, + const resizable_array<int>& predicted_column, int& marker_column, + const IWString& marker_column_name, + resizable_array_p<Predicted_Values>& zdata) { input.set_dos(1); const_IWSubstring buffer; - for (int i = 0; i < records_to_skip; i++) - { + for (int i = 0; i < records_to_skip; i++) { input.next_record(buffer); - if (1 == input.lines_read()) - { - if (! establish_column_titles(buffer, experimental_column, predicted_column, marker_column, marker_column_name)) + if (1 == input.lines_read()) { + if (!establish_column_titles(buffer, experimental_column, predicted_column, + marker_column, marker_column_name)) { return 0; + } } } int records_read = 0; - while (input.next_record(buffer)) - { - if (1 == input.lines_read()) - { - if (! establish_column_titles(buffer, experimental_column, predicted_column, marker_column, marker_column_name)) + while (input.next_record(buffer)) { + if (1 == input.lines_read()) { + if (!establish_column_titles(buffer, experimental_column, predicted_column, + marker_column, marker_column_name)) { return 0; + } } - Predicted_Values * p = new Predicted_Values(); + Predicted_Values* p = new Predicted_Values(); int fatal; - if (! p->parse_buffer(buffer, experimental_column, predicted_column, marker_column, fatal)) - { + if (!p->parse_buffer(buffer, experimental_column, predicted_column, marker_column, + fatal)) { delete p; - if (fatal) - cerr << "Fatal error processing '" << buffer << "', line " << input.lines_read() << endl; + if (fatal) { + cerr << "Fatal error processing '" << buffer << "', line " << input.lines_read() + << '\n'; + } - if (fatal) + if (fatal) { return 0; - else + } else { continue; + } } zdata.add(p); @@ -1066,42 +1038,38 @@ read_the_data (iwstring_data_source & input, records_read++; } - if (verbose) + if (verbose) { cerr << "Read " << records_read << " records\n"; + } return records_read; } static int -read_the_data (const char * fname, - int experimental_column, - const resizable_array<int> & predicted_column, - int & marker_column, - const IWString & marker_column_name, - resizable_array_p<Predicted_Values> & zdata) -{ +read_the_data(const char* fname, int experimental_column, + const resizable_array<int>& predicted_column, int& marker_column, + const IWString& marker_column_name, + resizable_array_p<Predicted_Values>& zdata) { iwstring_data_source input(fname); - if (! input.ok()) - { + if (!input.ok()) { cerr << "Cannot open '" << fname << "'\n"; return 0; } - if (0 == zdata.elements_allocated()) - zdata.resize(1000); // just a guess - else + if (0 == zdata.elements_allocated()) { + zdata.resize(1000); // just a guess + } else { zdata.resize_keep_storage(0); + } - return read_the_data(input, experimental_column, predicted_column, marker_column, marker_column_name, zdata); + return read_the_data(input, experimental_column, predicted_column, marker_column, + marker_column_name, zdata); } static int -echo_the_data (const resizable_array_p<Predicted_Values> & zdata, - std::ostream & output) -{ - for (int i = 0; i < zdata.number_elements(); i++) - { +echo_the_data(const resizable_array_p<Predicted_Values>& zdata, std::ostream& output) { + for (int i = 0; i < zdata.number_elements(); i++) { zdata[i]->debug_print(output); } @@ -1109,16 +1077,13 @@ echo_the_data (const resizable_array_p<Predicted_Values> & zdata, } static void -do_sort_by_predicted_value(resizable_array_p<Predicted_Values> & zdata, - int which_predicted_set, - int predicted_column) -{ - if (randomise_ties) - { +do_sort_by_predicted_value(resizable_array_p<Predicted_Values>& zdata, + int which_predicted_set, int predicted_column) { + if (randomise_ties) { std::random_device rd; std::default_random_engine generator(rd()); std::uniform_real_distribution<double> u(0.0, 1.0); - for (auto * item : zdata) { + for (auto* item : zdata) { item->assign_random_value(u(generator)); } } @@ -1127,9 +1092,8 @@ do_sort_by_predicted_value(resizable_array_p<Predicted_Values> & zdata, zdata.iwqsort(pvc); - if (verbose > 2) - { - cerr << "After sorting on column " << predicted_column << endl; + if (verbose > 2) { + cerr << "After sorting on column " << predicted_column << '\n'; echo_the_data(zdata, cerr); } @@ -1137,43 +1101,37 @@ do_sort_by_predicted_value(resizable_array_p<Predicted_Values> & zdata, } static void -establish_range_of_experimental_data(int number_records, - int experimental_column, - const resizable_array_p<Predicted_Values> & zdata, - experimental_value_t & lower_experimental_value, - experimental_value_t & upper_experimental_value) -{ - assert (experimental_column >= 0); +establish_range_of_experimental_data(int number_records, int experimental_column, + const resizable_array_p<Predicted_Values>& zdata, + experimental_value_t& lower_experimental_value, + experimental_value_t& upper_experimental_value) { + assert(experimental_column >= 0); lower_experimental_value = upper_experimental_value = zdata[0]->obs(); - for (int i = 1; i < number_records; i++) - { - const Predicted_Values & pvi = *(zdata[i]); + for (int i = 1; i < number_records; i++) { + const Predicted_Values& pvi = *(zdata[i]); experimental_value_t o = pvi.obs(); - if (o < lower_experimental_value) + if (o < lower_experimental_value) { lower_experimental_value = o; - else if (o > upper_experimental_value) + } else if (o > upper_experimental_value) { upper_experimental_value = o; + } } return; } static void -do_any_truncations_needed (experimental_value_t & pred, - const experimental_value_t lower_experimental_value, - const experimental_value_t upper_experimental_value) -{ - if (pred > upper_experimental_value) - { +do_any_truncations_needed(experimental_value_t& pred, + const experimental_value_t lower_experimental_value, + const experimental_value_t upper_experimental_value) { + if (pred > upper_experimental_value) { values_higher_than_experimental_range++; pred = upper_experimental_value; - } - else if (pred < lower_experimental_value) - { + } else if (pred < lower_experimental_value) { values_lower_than_experimental_range++; pred = lower_experimental_value; } @@ -1182,89 +1140,78 @@ do_any_truncations_needed (experimental_value_t & pred, } static float -compute_observed_range (const resizable_array_p<Predicted_Values> & zdata, - int number_records) -{ +compute_observed_range(const resizable_array_p<Predicted_Values>& zdata, + int number_records) { experimental_value_t minval = zdata[0]->obs(); experimental_value_t maxval = minval; - for (int i = 1; i < number_records; i++) - { + for (int i = 1; i < number_records; i++) { experimental_value_t o = zdata[i]->obs(); - if (o < minval) + if (o < minval) { minval = o; - else if (o > maxval) + } else if (o > maxval) { maxval = o; + } } return maxval - minval; } static double -compute_relative_error (float obs, - float pred) -{ - if (obs == pred) // no error +compute_relative_error(float obs, float pred) { + if (obs == pred) { // no error return 0.0; + } - if (fabs(obs - pred) < 1.0e-05) // numerically close enough + if (fabs(obs - pred) < 1.0e-05) { // numerically close enough return 0.0; + } - if (fabs(obs) < 1.0e-05 && fabs(pred) < 1.0e-05) // both are very small - probably covered above + // both are very small - probably covered above + if (fabs(obs) < 1.0e-05 && fabs(pred) < 1.0e-05) { return 0.0; + } float rc = fabs((obs - pred) / obs); - if (rc > relative_error_threshold) + if (rc > relative_error_threshold) { return relative_error_threshold; + } return rc; } static double -compute_range_normal_relative_error (experimental_value_t obs, - experimental_value_t pred, - double obs_range) -{ +compute_range_normal_relative_error(experimental_value_t obs, experimental_value_t pred, + double obs_range) { return fabs(obs - pred) / obs_range; } -class CMSR_Parameters -{ - public: - float _v1; - float _v2; - float _v3; - int _pct; +class CMSR_Parameters { + public: + float _v1; + float _v2; + float _v3; + int _pct; }; static int -write_cmsr (const CMSR_Parameters & cmsrp, - const int which_predicted_set, - const int predicted_column, - const Accumulator<double> & e, - const float * tmp1, - const float * tmp2, - float * tmpr, - const int ndx, - std::ostream & output) -{ - -// Note that we are using the tmp2 array, so we need to do this computation -// before we call compute_b_squared which zorches that array. +write_cmsr(const CMSR_Parameters& cmsrp, const int which_predicted_set, + const int predicted_column, const Accumulator<double>& e, const float* tmp1, + const float* tmp2, float* tmpr, const int ndx, std::ostream& output) { + // Note that we are using the tmp2 array, so we need to do this computation + // before we call compute_b_squared which zorches that array. Accumulator<double> d; - for (auto i = 0; i < ndx; ++i) - { + for (auto i = 0; i < ndx; ++i) { d.extra(tmp2[i]); } double bias = d.average(); double sd = sqrt(d.variance()); - if (0.0 == sd) - { + if (0.0 == sd) { cerr << "write_cmsr:variance is zero, cannot process\n"; return 0; } @@ -1272,110 +1219,94 @@ write_cmsr (const CMSR_Parameters & cmsrp, bias = fabs(bias); double k = cmsrp._v1 + cmsrp._v2 * exp(-cmsrp._v3 * bias / sd); -//#define DEBUG_CMSR 20 +// #define DEBUG_CMSR 20 #ifdef DEBUG_CMSR - cerr << "Bias " << bias << " sd " << sd << ", k = " << k << endl; + cerr << "Bias " << bias << " sd " << sd << ", k = " << k << '\n'; #endif float cmsr_sd = pow(10.0, bias + k * sd); - if (which_predicted_set >= 0 && predicted_column >= 0) + if (which_predicted_set >= 0 && predicted_column >= 0) { write_something_identifying_the_column(predicted_column, output); + } - output << " cMSR" << cmsrp._pct << "_sd = " << cmsr_sd << endl; + output << " cMSR" << cmsrp._pct << "_sd = " << cmsr_sd << '\n'; std::copy(tmp2, tmp2 + ndx, tmpr); #ifdef DEBUG_CMSR - for (auto i = 0; i < DEBUG_CMSR; ++i) - { - cerr << "tmpr after copy from tmp2 " << tmpr[i] << endl; + for (auto i = 0; i < DEBUG_CMSR; ++i) { + cerr << "tmpr after copy from tmp2 " << tmpr[i] << '\n'; } #endif float median_difference; - if (proper_median && ndx == (ndx / 2 * 2)) - { - std::partial_sort(tmpr, tmpr + ndx/2 + 1, tmpr+ndx); - median_difference = 0.50 * (tmpr[ndx/2-1] + tmpr[ndx/2]); - } - else - { - std::nth_element(tmpr, tmpr+ndx/2+1, tmpr+ndx); - median_difference = tmpr[ndx/2]; + if (proper_median && ndx == (ndx / 2 * 2)) { + std::partial_sort(tmpr, tmpr + ndx / 2 + 1, tmpr + ndx); + median_difference = 0.50 * (tmpr[ndx / 2 - 1] + tmpr[ndx / 2]); + } else { + std::nth_element(tmpr, tmpr + ndx / 2 + 1, tmpr + ndx); + median_difference = tmpr[ndx / 2]; } #ifdef DEBUG_CMSR - cerr << "Median diff " << median_difference << endl; - for (auto i = 0; i < DEBUG_CMSR; ++i) - { - cerr << " partially sorted " << i << ' ' << tmpr[i] << endl; + cerr << "Median diff " << median_difference << '\n'; + for (auto i = 0; i < DEBUG_CMSR; ++i) { + cerr << " partially sorted " << i << ' ' << tmpr[i] << '\n'; } #endif - for (int i = 0; i < ndx; ++i) - { + for (int i = 0; i < ndx; ++i) { tmpr[i] = fabs(tmp2[i] - median_difference); } #ifdef DEBUG_CMSR - for (auto i = 0; i < DEBUG_CMSR; ++i) - { - cerr << "abs diff from median " << tmpr[i] << endl; + for (auto i = 0; i < DEBUG_CMSR; ++i) { + cerr << "abs diff from median " << tmpr[i] << '\n'; } #endif float mad; - if (proper_median && ndx == (ndx / 2 * 2)) - { - std::partial_sort(tmpr, tmpr + ndx/2+1, tmpr+ndx); - mad = 0.50 * (tmpr[ndx/2-1] + tmpr[ndx/2]); - } - else - { - std::nth_element(tmpr, tmpr + ndx/2, tmpr + ndx); - mad = tmpr[ndx/2]; + if (proper_median && ndx == (ndx / 2 * 2)) { + std::partial_sort(tmpr, tmpr + ndx / 2 + 1, tmpr + ndx); + mad = 0.50 * (tmpr[ndx / 2 - 1] + tmpr[ndx / 2]); + } else { + std::nth_element(tmpr, tmpr + ndx / 2, tmpr + ndx); + mad = tmpr[ndx / 2]; } mad = mad * 1.4826; #ifdef DEBUG_CMSR - cerr << "median diff " << tmpr[ndx/2] << " MAD " << mad << endl; + cerr << "median diff " << tmpr[ndx / 2] << " MAD " << mad << '\n'; #endif - if (which_predicted_set >= 0 && predicted_column >= 0) + if (which_predicted_set >= 0 && predicted_column >= 0) { write_something_identifying_the_column(predicted_column, output); + } - k = cmsrp._v1 + cmsrp._v2 * exp(-cmsrp._v3 * bias/mad); + k = cmsrp._v1 + cmsrp._v2 * exp(-cmsrp._v3 * bias / mad); - if (do_cMSD) - { + if (do_cMSD) { float cmsd = bias + k * mad; - output << " cMSD" << cmsrp._pct << " = " << cmsd << endl; - } - else - { + output << " cMSD" << cmsrp._pct << " = " << cmsd << '\n'; + } else { float cmsr_mad = pow(10.0, bias + k * mad); - output << " cMSR" << cmsrp._pct << "_mad = " << cmsr_mad << endl; + output << " cMSR" << cmsrp._pct << "_mad = " << cmsr_mad << '\n'; } return 1; } static int -write_fold_data (const int predicted_column, - const resizable_array<float> & fold_difference, - const int * n_fold_difference, - const int N, - const char star_or_plus, - std::ostream & output) -{ +write_fold_data(const int predicted_column, const resizable_array<float>& fold_difference, + const int* n_fold_difference, const int N, const char star_or_plus, + std::ostream& output) { write_something_identifying_the_column(predicted_column, output); output << ' ' << star_or_plus << " fold"; - for (int i = 0; i < fold_difference.number_elements(); ++i) - { + for (int i = 0; i < fold_difference.number_elements(); ++i) { float r = n_fold_difference[i] / static_cast<float>(N); output << ' ' << fold_difference[i] << ' ' << n_fold_difference[i] << ' ' << r; @@ -1387,44 +1318,43 @@ write_fold_data (const int predicted_column, } static void -compute_fold_difference_values_additive (const float obs, - const float pred, - const resizable_array<float> & fold_difference, - int * n_fold_difference) -{ +compute_fold_difference_values_additive(const float obs, const float pred, + const resizable_array<float>& fold_difference, + int* n_fold_difference) { float d = fabs(obs - pred); - for (int i = 0; i < fold_difference.number_elements(); ++i) - { - if (d < fold_difference[i]) + for (int i = 0; i < fold_difference.number_elements(); ++i) { + if (d < fold_difference[i]) { n_fold_difference[i]++; + } } return; } static void -compute_fold_difference_values_multiplicative (const float obs, - const float pred, - const resizable_array<float> & fold_difference, - int * n_fold_difference) -{ - if (fabs(obs) < 1.0e-04 || fabs(pred) < 1.0e-04) +compute_fold_difference_values_multiplicative( + const float obs, const float pred, const resizable_array<float>& fold_difference, + int* n_fold_difference) { + if (fabs(obs) < 1.0e-04 || fabs(pred) < 1.0e-04) { return; + } - if (obs * pred < 0.0f) + if (obs * pred < 0.0f) { return; + } float ratio; - if (obs < pred) + if (obs < pred) { ratio = pred / obs; - else + } else { ratio = obs / pred; + } - for (int i = 0; i < fold_difference.number_elements(); ++i) - { - if (ratio < fold_difference[i]) + for (int i = 0; i < fold_difference.number_elements(); ++i) { + if (ratio < fold_difference[i]) { n_fold_difference[i]++; + } } return; @@ -1436,90 +1366,90 @@ compute_fold_difference_values_multiplicative (const float obs, */ static int -iwstats (unsigned int number_records, - const IWString * chunk_title, - int which_predicted_set, - int predicted_column, - int experimental_column, - float * tmp1, - float * tmp2, - float * tmpr, - resizable_array_p<Predicted_Values> & zdata, - std::ostream & output) -{ +iwstats(unsigned int number_records, const IWString* chunk_title, int which_predicted_set, + int predicted_column, int experimental_column, float* tmp1, float* tmp2, + float* tmpr, resizable_array_p<Predicted_Values>& zdata, std::ostream& output) { experimental_value_t lower_experimental_value = static_cast<experimental_value_t>(0.0); experimental_value_t upper_experimental_value = static_cast<experimental_value_t>(0.0); - if (truncate_predicted_values_to_experimental_range) - { + if (truncate_predicted_values_to_experimental_range) { values_lower_than_experimental_range = 0; values_higher_than_experimental_range = 0; - establish_range_of_experimental_data(number_records, experimental_column, zdata, lower_experimental_value, upper_experimental_value); + establish_range_of_experimental_data(number_records, experimental_column, zdata, + lower_experimental_value, + upper_experimental_value); } - if (predicted_column >= 0) + if (predicted_column >= 0) { do_sort_by_predicted_value(zdata, which_predicted_set, predicted_column); + } #ifdef ECHO_THE_DATA - cerr << "Processing " << number_records << " of " << which_predicted_set << " in column " << predicted_column << endl; + cerr << "Processing " << number_records << " of " << which_predicted_set + << " in column " << predicted_column << '\n'; - cerr << "N = " << zdata.number_elements() << endl; - for (auto i = 0; i < zdata.number_elements(); ++i) - { - cerr << zdata[i]->obs() << ' ' << zdata[i]->pred(0) << endl; + cerr << "N = " << zdata.number_elements() << '\n'; + for (auto i = 0; i < zdata.number_elements(); ++i) { + cerr << zdata[i]->obs() << ' ' << zdata[i]->pred(0) << '\n'; } #endif double obs_range; - if (range_normal_relative_error) + if (range_normal_relative_error) { obs_range = compute_observed_range(zdata, number_records); - else + } else { obs_range = 0.0; + } -// Do means and R2 + // Do means and R2 - Accumulator<double> o, p; // obs and pred - Accumulator<double> e, ae; // the error and absolute error - Accumulator<double> are; // average relative error - Accumulator<double> rnre; // range normalised average relative error + Accumulator<double> o, p; // obs and pred + Accumulator<double> e, ae; // the error and absolute error + Accumulator<double> are; // average relative error + Accumulator<double> rnre; // range normalised average relative error double r = 0.0; int ndx = 0; - int * n_fold_difference_additive = nullptr; - if (fold_difference_additive.number_elements()) + int* n_fold_difference_additive = nullptr; + if (fold_difference_additive.number_elements()) { n_fold_difference_additive = new_int(fold_difference_additive.number_elements()); + } std::unique_ptr<int[]> free_n_fold_difference_additive(n_fold_difference_additive); - int * n_fold_difference_multiplicative = nullptr; - if (fold_difference_multiplicative.number_elements()) - n_fold_difference_multiplicative = new_int(fold_difference_multiplicative.number_elements()); + int* n_fold_difference_multiplicative = nullptr; + if (fold_difference_multiplicative.number_elements()) { + n_fold_difference_multiplicative = + new_int(fold_difference_multiplicative.number_elements()); + } - std::unique_ptr<int[]> free_n_fold_difference_multiplicative(n_fold_difference_multiplicative); + std::unique_ptr<int[]> free_n_fold_difference_multiplicative( + n_fold_difference_multiplicative); - for (unsigned int i = 0; i < number_records; i++) - { - const Predicted_Values & pvi = *(zdata[i]); + for (unsigned int i = 0; i < number_records; i++) { + const Predicted_Values& pvi = *(zdata[i]); - if (! pvi.valid(which_predicted_set)) + if (!pvi.valid(which_predicted_set)) { continue; + } experimental_value_t pred = pvi.pred(which_predicted_set); p.extra(pred); -// cerr << " i = " << i << " processing predicted value " << pred << endl; + // cerr << " i = " << i << " processing predicted value " << pred << '\n'; - if (truncate_predicted_values_to_experimental_range) + if (truncate_predicted_values_to_experimental_range) { do_any_truncations_needed(pred, lower_experimental_value, upper_experimental_value); + } - if (experimental_column >= 0) - { + if (experimental_column >= 0) { experimental_value_t obs = pvi.obs(); - if (obs < discard_measured_values_below) + if (obs < discard_measured_values_below) { continue; + } o.extra(obs); @@ -1528,27 +1458,32 @@ iwstats (unsigned int number_records, e.extra(obs - pred); ae.extra(fabs(obs - pred)); -// tmp1[ndx] = fabs(obs - pred); -// tmp2[ndx] = (obs - pred); + // tmp1[ndx] = fabs(obs - pred); + // tmp2[ndx] = (obs - pred); tmp1[ndx] = obs; tmp2[ndx] = pred; ndx++; - if (fold_difference_additive.number_elements()) - compute_fold_difference_values_additive(obs, pred, fold_difference_additive, n_fold_difference_additive); - if (fold_difference_multiplicative.number_elements()) - compute_fold_difference_values_multiplicative(obs, pred, fold_difference_multiplicative, n_fold_difference_multiplicative); + if (fold_difference_additive.number_elements()) { + compute_fold_difference_values_additive(obs, pred, fold_difference_additive, + n_fold_difference_additive); + } + if (fold_difference_multiplicative.number_elements()) { + compute_fold_difference_values_multiplicative( + obs, pred, fold_difference_multiplicative, n_fold_difference_multiplicative); + } - if (relative_error_threshold > static_cast<float>(0.0)) + if (relative_error_threshold > static_cast<float>(0.0)) { are.extra(compute_relative_error(obs, pred)); - if (range_normal_relative_error) + } + if (range_normal_relative_error) { rnre.extra(compute_range_normal_relative_error(obs, pred, obs_range)); + } } } - if (0 == p.n()) - { + if (0 == p.n()) { output << "no values for "; write_something_identifying_the_column(predicted_column, output); output << '\n'; @@ -1556,8 +1491,7 @@ iwstats (unsigned int number_records, return 1; } - if (p.n() < values_needed_for_reporting_correlations) - { + if (p.n() < values_needed_for_reporting_correlations) { output << "Too few pairs " << p.n() << " for "; write_something_identifying_the_column(predicted_column, output); output << '\n'; @@ -1565,38 +1499,37 @@ iwstats (unsigned int number_records, return 1; } -//cerr << "Read " << p.n() << " predicted and " << o.n() << " obs values\n"; + // cerr << "Read " << p.n() << " predicted and " << o.n() << " obs values\n"; - if (verbose > 1 && p.n() < number_records) - { + if (verbose > 1 && p.n() < number_records) { cerr << "Only " << p.n() << " value pairs for "; write_something_identifying_the_column(predicted_column, cerr); cerr << '\n'; } - if (experimental_column >= 0) - { + if (experimental_column >= 0) { output << "Experimental/Measured values in column " << (experimental_column + 1); - if (activity_name.length() > 0) + if (activity_name.length() > 0) { output << ' ' << activity_name; + } output << ". Range " << o.minval() << " and " << o.maxval(); - if (o.n() < 2) + if (o.n() < 2) { output << " hmmm, only " << o.n() << " values available\n"; - else + } else { output << " ave " << o.average() << '\n'; + } } - if (predicted_column >= 0) - { + if (predicted_column >= 0) { output << "Predicted values in column " << (predicted_column + 1); - write_something_identifying_the_column (predicted_column, output); - output << ". Range " << p.minval() << " and " << p.maxval() << " ave " << p.average() << " N = " << p.n() << '\n'; + write_something_identifying_the_column(predicted_column, output); + output << ". Range " << p.minval() << " and " << p.maxval() << " ave " << p.average() + << " N = " << p.n() << '\n'; double obar = o.average(); double pbar = p.average(); - if (p.minval() == p.maxval()) - { + if (p.minval() == p.maxval()) { cerr << "All predictions constant " << p.minval() << '\n'; write_something_identifying_the_column(predicted_column, output); output << " R2 " << 0.0 << '\n'; @@ -1604,80 +1537,86 @@ iwstats (unsigned int number_records, output << " Q2 " << 0.0 << '\n'; output << " Average absolute error " << ae.average() << '\n'; output << " Predicted Unbiased Bsquared 0\n"; - if (static_cast<float>(0.0) != relative_error_threshold) + if (static_cast<float>(0.0) != relative_error_threshold) { output << " Average Relative Error 0\n"; - if (range_normal_relative_error) + } + if (range_normal_relative_error) { output << "Range Normal Relative Error 0\n"; + } return output.good(); } double nx1bx2b = static_cast<double>(o.n()) * obar * pbar; -// cerr << "r = " << r << " nx1bx2b = " << nx1bx2b << endl; + // cerr << "r = " << r << " nx1bx2b = " << nx1bx2b << '\n'; double v1 = o.sum_of_squares() - o.n() * obar * obar; double v2 = p.sum_of_squares() - o.n() * pbar * pbar; - if (0.0 == v1 || 0.0 == v2) - { - cerr << "Yipes, zero qzyq term " << v1 << " and v2 = " << v2 << endl; + if (0.0 == v1 || 0.0 == v2) { + cerr << "Yipes, zero qzyq term " << v1 << " and v2 = " << v2 << '\n'; return 0; } -// cerr << " v1 " << v1 << " v2 " << v2 << endl; + // cerr << " v1 " << v1 << " v2 " << v2 << '\n'; double rho = (r - nx1bx2b) / sqrt(v1 * v2); - - if (values_lower_than_experimental_range || values_higher_than_experimental_range) - output << values_lower_than_experimental_range << " values lower than expt.min, " << values_higher_than_experimental_range << " greater than max\n"; - output << "Errors between " << e.minval() << " and " << e.maxval() << " ave " << e.average() << endl; + if (values_lower_than_experimental_range || values_higher_than_experimental_range) { + output << values_lower_than_experimental_range << " values lower than expt.min, " + << values_higher_than_experimental_range << " greater than max\n"; + } + + output << "Errors between " << e.minval() << " and " << e.maxval() << " ave " + << e.average() << '\n'; output << "Average absolute error " << ae.average() << '\n'; - output << "RMS error " << sqrt(ae.sum_of_squares() / static_cast<double>(ae.n())) << endl; + output << "RMS error " << sqrt(ae.sum_of_squares() / static_cast<double>(ae.n())) + << '\n'; - if (static_cast<float>(0.0) != relative_error_threshold) - output << "Average Relative Error " << static_cast<float>(are.average()) << '\n'; + if (static_cast<float>(0.0) != relative_error_threshold) { + output << "Average Relative Error " << static_cast<float>(are.average()) << '\n'; + } - if (range_normal_relative_error) - output << "Average Range Normal Relative Error " << static_cast<float>(rnre.average()) << '\n'; + if (range_normal_relative_error) { + output << "Average Range Normal Relative Error " + << static_cast<float>(rnre.average()) << '\n'; + } write_something_identifying_the_column(predicted_column, output); output << " R2 "; - if (wikipedia_r2_definition) - { - double n = 0.0; // numerator - double dno = 0.0; // denominator for observed - double dnp = 0.0; // denominator for predicted - for (int i = 0; i < ndx; ++i) - { + if (wikipedia_r2_definition) { + double n = 0.0; // numerator + double dno = 0.0; // denominator for observed + double dnp = 0.0; // denominator for predicted + for (int i = 0; i < ndx; ++i) { n += (tmp1[i] - obar) * (tmp2[i] - pbar); dno += (tmp1[i] - obar) * (tmp1[i] - obar); dnp += (tmp2[i] - pbar) * (tmp2[i] - pbar); } - if (n < 0.0) + if (n < 0.0) { output << '-'; + } double r2 = n * n / (dno * dnp); - output << static_cast<float>(r2) << endl; - } - else - { - if (rho < 0.0) + output << static_cast<float>(r2) << '\n'; + } else { + if (rho < 0.0) { output << '-'; - output << static_cast<float>(rho * rho) << endl; + } + output << static_cast<float>(rho * rho) << '\n'; } -// Q squared + // Q squared double sum1 = 0.0; double sum2 = 0.0; - for (unsigned int i = 0; i < number_records; i++) - { - const Predicted_Values & pvi = *(zdata[i]); + for (unsigned int i = 0; i < number_records; i++) { + const Predicted_Values& pvi = *(zdata[i]); - if (! pvi.valid(which_predicted_set)) + if (!pvi.valid(which_predicted_set)) { continue; + } experimental_value_t pred = pvi.pred(which_predicted_set); @@ -1686,77 +1625,88 @@ iwstats (unsigned int number_records, } double q2; - if (traditional_q2_definition) - q2 = 1.0 - sum1 / sum2; - else if (sum1 > sum2) - q2 = - (1.0 - sum2 / sum1); - else + if (traditional_q2_definition) { + q2 = 1.0 - sum1 / sum2; + } else if (sum1 > sum2) { + q2 = -(1.0 - sum2 / sum1); + } else { q2 = 1.0 - sum1 / sum2; + } write_something_identifying_the_column(predicted_column, output); - if (traditional_q2_definition) + if (traditional_q2_definition) { output << " trQ2 "; - else + } else { output << " Q2 "; - output << static_cast<float>(q2) << endl; + } + output << static_cast<float>(q2) << '\n'; write_something_identifying_the_column(predicted_column, output); - output << " Bias " << (o.average() - p.average()) << endl; + output << " Bias " << (o.average() - p.average()) << '\n'; sum1 = 0.0; - for (unsigned int i = 0; i < number_records; i++) - { - const Predicted_Values & pvi = *(zdata[i]); + for (unsigned int i = 0; i < number_records; i++) { + const Predicted_Values& pvi = *(zdata[i]); - if (! pvi.valid(which_predicted_set)) + if (!pvi.valid(which_predicted_set)) { continue; + } - experimental_value_t obs = pvi.obs(); + experimental_value_t obs = pvi.obs(); experimental_value_t pred = pvi.pred(which_predicted_set); sum1 += (obs - obar) * (pred - pbar); } -// write_something_identifying_the_column (predicted_column, output); -// output << " R2 " << (sum1 / (p.variance() * o.variance()) / static_cast<double> (number_records)) << endl; + // write_something_identifying_the_column (predicted_column, output); + // output << " R2 " << (sum1 / (p.variance() * o.variance()) / static_cast<double> + // (number_records)) << '\n'; } - if (fold_difference_additive.number_elements()) - write_fold_data(predicted_column, fold_difference_additive, n_fold_difference_additive, number_records, '+', output); + if (fold_difference_additive.number_elements()) { + write_fold_data(predicted_column, fold_difference_additive, + n_fold_difference_additive, number_records, '+', output); + } - if (fold_difference_multiplicative.number_elements()) - write_fold_data(predicted_column, fold_difference_multiplicative, n_fold_difference_multiplicative, number_records, '*', output); + if (fold_difference_multiplicative.number_elements()) { + write_fold_data(predicted_column, fold_difference_multiplicative, + n_fold_difference_multiplicative, number_records, '*', output); + } int duplicate_predicted_values_present; - if (predicted_column >= 0) - duplicate_predicted_values_present = duplicate_predicted_values(zdata, which_predicted_set); - else + if (predicted_column >= 0) { + duplicate_predicted_values_present = + duplicate_predicted_values(zdata, which_predicted_set); + } else { duplicate_predicted_values_present = 0; + } - if (0 == verbose || predicted_column < 0) // don't write anything + if (0 == verbose || predicted_column < 0) { // don't write anything ; - else if (0 == duplicate_predicted_values_present) - cerr << "No duplicate predicted values in column " << (predicted_column + 1) << endl; - else - cerr << "Duplicate prediced values present in column " << (predicted_column + 1) << endl; + } else if (0 == duplicate_predicted_values_present) { + cerr << "No duplicate predicted values in column " << (predicted_column + 1) << '\n'; + } else { + cerr << "Duplicate prediced values present in column " << (predicted_column + 1) + << '\n'; + } - if (nullptr != chunk_title) // we are dealing with a subset + if (nullptr != chunk_title) { // we are dealing with a subset output << " first " << *(chunk_title) << " (" << number_records << " records)\n"; + } - for (int i = 0; i < ndx; ++i) - { + for (int i = 0; i < ndx; ++i) { float o = tmp1[i]; float p = tmp2[i]; tmp1[i] = fabs(o - p); - tmp2[i] = (o - p); + tmp2[i] = (o - p); } Float_Comparator fc; iwqsort(tmp1, ndx, fc); write_something_identifying_the_column(predicted_column, output); - output << " AE50 = " << tmp1[ndx/2] << "\n"; + output << " AE50 = " << tmp1[ndx / 2] << "\n"; write_something_identifying_the_column(predicted_column, output); output << " AE75 = " << tmp1[ndx * 75 / 100] << "\n"; @@ -1765,18 +1715,15 @@ iwstats (unsigned int number_records, output << " AE95 = " << tmp1[ndx * 95 / 100] << "\n"; #ifdef DEBUG_CMSR - for (auto i = 0; i < DEBUG_CMSR; ++i) - { - cerr << "tmp2 " << tmp2[i] << endl; + for (auto i = 0; i < DEBUG_CMSR; ++i) { + cerr << "tmp2 " << tmp2[i] << '\n'; } #endif - if (stream_for_residuals.is_open()) - { + if (stream_for_residuals.is_open()) { write_something_identifying_the_column(predicted_column, stream_for_residuals); stream_for_residuals << '\n'; - for (int i = 0; i < ndx; ++i) - { + for (int i = 0; i < ndx; ++i) { stream_for_residuals << tmp2[i] << '\n'; stream_for_residuals.write_if_buffer_holds_more_than(4096); } @@ -1789,159 +1736,173 @@ iwstats (unsigned int number_records, cmsrp._v3 = 4.134; cmsrp._pct = 95; - write_cmsr(cmsrp, which_predicted_set, predicted_column, e, tmp1, tmp2, tmpr, ndx, output); + write_cmsr(cmsrp, which_predicted_set, predicted_column, e, tmp1, tmp2, tmpr, ndx, + output); cmsrp._v1 = 1.274; cmsrp._v2 = 0.382; cmsrp._v3 = 3.448; cmsrp._pct = 90; - write_cmsr(cmsrp, which_predicted_set, predicted_column, e, tmp1, tmp2, tmpr, ndx, output); + write_cmsr(cmsrp, which_predicted_set, predicted_column, e, tmp1, tmp2, tmpr, ndx, + output); - if (which_predicted_set >= 0 && predicted_column >= 0) + if (which_predicted_set >= 0 && predicted_column >= 0) { write_something_identifying_the_column(predicted_column, output); + } - if (duplicate_predicted_values_present) + if (duplicate_predicted_values_present) { output << " Input"; - else + } else { output << " Unbiased"; + } double Bsquared; - compute_b_squared(number_records, experimental_column, zdata, tmp1, tmp2, Bsquared, which_predicted_set); + compute_b_squared(number_records, experimental_column, zdata, tmp1, tmp2, Bsquared, + which_predicted_set); + + output << " Bsquared " << static_cast<float>(Bsquared) << '\n'; - output << " Bsquared " << static_cast<float>(Bsquared) << endl; - - if(calculate_enrichment_metrics && initilize_enrichment(number_records,experimental_column,zdata,tmp1,which_predicted_set)) - { + if (calculate_enrichment_metrics && + initilize_enrichment(number_records, experimental_column, zdata, tmp1, + which_predicted_set)) { // Calculate the BEDROC metric - if (which_predicted_set >= 0 && predicted_column >= 0) + if (which_predicted_set >= 0 && predicted_column >= 0) { write_something_identifying_the_column(predicted_column, output); + } - calculateBEDROC bedroc( bedroc_alpha ); - double bedroc_value = bedroc( enrichment ); - output << " BEDROC " << static_cast<float>(bedroc_value) << endl; + calculateBEDROC bedroc(bedroc_alpha); + double bedroc_value = bedroc(enrichment); + output << " BEDROC " << static_cast<float>(bedroc_value) << '\n'; calculateROC roc; double roc_value = roc(enrichment); - if (which_predicted_set >= 0 && predicted_column >= 0) + if (which_predicted_set >= 0 && predicted_column >= 0) { write_something_identifying_the_column(predicted_column, output); + } - output << " ROC " << static_cast<float>(roc_value) << endl; + output << " ROC " << static_cast<float>(roc_value) << '\n'; calculateEF ef(enrichment_factor_fraction); double ef_value = ef(enrichment); - if (which_predicted_set >= 0 && predicted_column >= 0) + if (which_predicted_set >= 0 && predicted_column >= 0) { write_something_identifying_the_column(predicted_column, output); + } - output << " EF " << static_cast<float>(ef_value) << endl; + output << " EF " << static_cast<float>(ef_value) << '\n'; } -// To avoid horrible problems with iwqsort, which really doesn't do well sorting -// a nearly sorted list, we sort by a random value before each sort! + // To avoid horrible problems with iwqsort, which really doesn't do well sorting + // a nearly sorted list, we sort by a random value before each sort! - if (which_predicted_set >= 0 && duplicate_predicted_values_present && compute_range_of_bsquared_values_when_duplicates_present) - { - output << "Contains duplicate predicted values in column " << (predicted_column + 1) << ", computing best and worst Bsquared\n"; + if (which_predicted_set >= 0 && duplicate_predicted_values_present && + compute_range_of_bsquared_values_when_duplicates_present) { + output << "Contains duplicate predicted values in column " << (predicted_column + 1) + << ", computing best and worst Bsquared\n"; - std::random_shuffle(zdata.begin(), zdata.end()); // randomise before sorting + std::random_shuffle(zdata.begin(), zdata.end()); // randomise before sorting Predicted_Value_Comparitor_Best pvcb(which_predicted_set); zdata.iwqsort(pvcb); double best_bsquared; - compute_b_squared(number_records, experimental_column, zdata, tmp1, tmp2, best_bsquared, which_predicted_set); + compute_b_squared(number_records, experimental_column, zdata, tmp1, tmp2, + best_bsquared, which_predicted_set); write_something_identifying_the_column(predicted_column, output); - output << " Best Bsquared " << best_bsquared << endl; + output << " Best Bsquared " << best_bsquared << '\n'; - std::random_shuffle(zdata.begin(), zdata.end()); // randomise before sorting + std::random_shuffle(zdata.begin(), zdata.end()); // randomise before sorting Predicted_Value_Comparitor_Worst pvcw(which_predicted_set); zdata.iwqsort(pvcw); double worst_bsquared; - compute_b_squared(number_records, experimental_column, zdata, tmp1, tmp2, worst_bsquared, which_predicted_set); + compute_b_squared(number_records, experimental_column, zdata, tmp1, tmp2, + worst_bsquared, which_predicted_set); write_something_identifying_the_column(predicted_column, output); - output << " Worst Bsquared " << worst_bsquared << endl; + output << " Worst Bsquared " << worst_bsquared << '\n'; - float b2 = static_cast<float>((best_bsquared + worst_bsquared) * 0.5); // cut precision to suppress significant figures + float b2 = static_cast<float>((best_bsquared + worst_bsquared) * + 0.5); // cut precision to suppress significant figures write_something_identifying_the_column(predicted_column, output); - output << " Unbiased Bsquared " << b2 << endl; + output << " Unbiased Bsquared " << b2 << '\n'; } - if (number_distribution_buckets > 0) - do_compute_distribution_functions(number_records, which_predicted_set, predicted_column, experimental_column, tmp1, tmp2, zdata, output); + if (number_distribution_buckets > 0) { + do_compute_distribution_functions(number_records, which_predicted_set, + predicted_column, experimental_column, tmp1, tmp2, + zdata, output); + } return output.good(); } static int -iwstats (int which_predicted_set, - int predicted_column, - int experimental_column, - float * tmp1, - float * tmp2, - float * tmpr, - const resizable_array<int> & numbers_to_check, - resizable_array_p<Predicted_Values> & zdata, - std::ostream & output) -{ - if (numbers_to_check.empty()) // no subsetting, doing the whole file at once - return iwstats(zdata.number_elements(), nullptr, which_predicted_set, predicted_column, experimental_column, tmp1, tmp2, tmpr, zdata, output); - - for (int i = 0; i < numbers_to_check.number_elements(); i++) - { +iwstats(int which_predicted_set, int predicted_column, int experimental_column, + float* tmp1, float* tmp2, float* tmpr, + const resizable_array<int>& numbers_to_check, + resizable_array_p<Predicted_Values>& zdata, std::ostream& output) { + if (numbers_to_check.empty()) { // no subsetting, doing the whole file at once + return iwstats(zdata.number_elements(), nullptr, which_predicted_set, + predicted_column, experimental_column, tmp1, tmp2, tmpr, zdata, + output); + } + + for (int i = 0; i < numbers_to_check.number_elements(); i++) { int n = numbers_to_check[i]; - if (! iwstats(n, chunk_titles[i], which_predicted_set, predicted_column, experimental_column, tmp1, tmp2, tmpr, zdata, output)) + if (!iwstats(n, chunk_titles[i], which_predicted_set, predicted_column, + experimental_column, tmp1, tmp2, tmpr, zdata, output)) { return 0; + } } return output.good(); } static int -iwstats (const resizable_array<int> & predicted_column, - int experimental_column, - resizable_array_p<Predicted_Values> & zdata, - std::ostream & output) -{ +iwstats(const resizable_array<int>& predicted_column, int experimental_column, + resizable_array_p<Predicted_Values>& zdata, std::ostream& output) { int records_in_file = zdata.number_elements(); - assert (records_in_file > 1); + assert(records_in_file > 1); -// Do we want data on the first n or the first p% of the file + // Do we want data on the first n or the first p% of the file resizable_array<int> numbers_to_check; - if (step || percents_to_check.number_elements() || N_to_check.number_elements()) + if (step || percents_to_check.number_elements() || N_to_check.number_elements()) { determine_numbers_to_check(numbers_to_check, records_in_file); - else if (activities_to_check.number_elements() && experimental_column >= 0) + } else if (activities_to_check.number_elements() && experimental_column >= 0) { determine_numbers_to_check_by_activity(zdata, numbers_to_check); + } -//cerr << "Will check " << numbers_to_check.number_elements() << " items\n"; + // cerr << "Will check " << numbers_to_check.number_elements() << " items\n"; - float * tmp1 = new float[records_in_file]; std::unique_ptr<float[]> free_tmp1(tmp1); - float * tmp2 = new float[records_in_file]; std::unique_ptr<float[]> free_tmp2(tmp2); - float * tmpr = new float[records_in_file]; std::unique_ptr<float[]> free_tmpr(tmpr); + float* tmp1 = new float[records_in_file]; + std::unique_ptr<float[]> free_tmp1(tmp1); + float* tmp2 = new float[records_in_file]; + std::unique_ptr<float[]> free_tmp2(tmp2); + float* tmpr = new float[records_in_file]; + std::unique_ptr<float[]> free_tmpr(tmpr); - if (nullptr == tmp1 || nullptr == tmp2 || nullptr == tmpr) - { - cerr << "Memory failure, cannot allocate data for " << records_in_file << " records\n"; + if (nullptr == tmp1 || nullptr == tmp2 || nullptr == tmpr) { + cerr << "Memory failure, cannot allocate data for " << records_in_file + << " records\n"; return 9; } - for (int i = 0; i < predicted_column.number_elements(); i++) - { + for (int i = 0; i < predicted_column.number_elements(); i++) { int col = predicted_column[i]; - if (! iwstats(i, col, experimental_column, tmp1, tmp2, tmpr, numbers_to_check, zdata, output)) - { - cerr << "Fatal error processing column " << (col + 1) << endl; + if (!iwstats(i, col, experimental_column, tmp1, tmp2, tmpr, numbers_to_check, zdata, + output)) { + cerr << "Fatal error processing column " << (col + 1) << '\n'; return 0; } } @@ -1950,31 +1911,25 @@ iwstats (const resizable_array<int> & predicted_column, } static int -iwstats (const IW_STL_Hash_Map_int::const_iterator & f, - const resizable_array<int> & predicted_column, - int experimental_column, - resizable_array_p<Predicted_Values> & zdata, - std::ostream & output) -{ +iwstats(const IW_STL_Hash_Map_int::const_iterator& f, + const resizable_array<int>& predicted_column, int experimental_column, + resizable_array_p<Predicted_Values>& zdata, std::ostream& output) { resizable_array_p<Predicted_Values> tmp; const auto n = zdata.number_elements(); tmp.resize(n); - for (auto i = 0; i < n; ++i) - { - if ((*f).first == zdata[i]->marker()) + for (auto i = 0; i < n; ++i) { + if ((*f).first == zdata[i]->marker()) { tmp.add(zdata[i]); + } } - if (tmp.empty()) - { + if (tmp.empty()) { cerr << "Very strange, no records retrieved for marker '" << (*f).first << "'\n"; return 0; - } - else if (tmp.number_elements() < 3) - { + } else if (tmp.number_elements() < 3) { tmp.resize_no_delete(0); cerr << "Only one instance of '" << (*f).first << "', ignored\n"; return 1; @@ -1994,59 +1949,54 @@ iwstats (const IW_STL_Hash_Map_int::const_iterator & f, } static int -read_id_activity_hash_record (const const_IWSubstring & buffer, - IW_STL_Hash_Map<IWString, IWString> & id_activity_hash, - int experimental_column) -{ +read_id_activity_hash_record(const const_IWSubstring& buffer, + IW_STL_Hash_Map<IWString, IWString>& id_activity_hash, + int experimental_column) { int i = 0; IWString id; - if (! buffer.nextword(id, i, input_separator)) - { + if (!buffer.nextword(id, i, input_separator)) { cerr << "Cannot extract identifier from input '" << buffer << "'\n"; return 0; } - if (strip_leading_zeros_from_identifiers) + if (strip_leading_zeros_from_identifiers) { id.remove_leading_chars('0'); + } IWString act; - if (! buffer.nextword(act, i, input_separator)) - { + if (!buffer.nextword(act, i, input_separator)) { cerr << "Cannot extract second token from record '" << buffer << "'\n"; return 0; } - if (experimental_column > 1) - { - for (auto col = 1; col < experimental_column; ++col) - { - if (! buffer.nextword(act, i, input_separator)) - { + if (experimental_column > 1) { + for (auto col = 1; col < experimental_column; ++col) { + if (!buffer.nextword(act, i, input_separator)) { cerr << "Cannot find experimental data column '" << buffer << "'\n"; return 0; } } } - if (0 == id_activity_hash.size()) + if (0 == id_activity_hash.size()) { activity_name = act; + } - if ("." == act) - { - cerr << "Missing value encountered in experimental file '" << buffer << "', impossible\n"; + if ("." == act) { + cerr << "Missing value encountered in experimental file '" << buffer + << "', impossible\n"; return 0; } double notused; - if (act.numeric_value(notused)) // great + if (act.numeric_value(notused)) { // great ; - else if (0 == id_activity_hash.size()) // header + } else if (0 == id_activity_hash.size()) { // header ; - else - { + } else { cerr << "Invalid numeric value in experimental file '" << buffer << "'\n"; return 0; } @@ -2057,19 +2007,17 @@ read_id_activity_hash_record (const const_IWSubstring & buffer, } static int -read_id_activity_hash (iwstring_data_source & input, - IW_STL_Hash_Map<IWString, IWString> & id_activity_hash, - int experimental_column) -{ +read_id_activity_hash(iwstring_data_source& input, + IW_STL_Hash_Map<IWString, IWString>& id_activity_hash, + int experimental_column) { const_IWSubstring buffer; - while (input.next_record(buffer)) - { + while (input.next_record(buffer)) { buffer.strip_trailing_blanks(); - if (! read_id_activity_hash_record(buffer, id_activity_hash, experimental_column)) - { - cerr << "Invalid id/activity record, line " << input.lines_read() << " '" << buffer << "'\n"; + if (!read_id_activity_hash_record(buffer, id_activity_hash, experimental_column)) { + cerr << "Invalid id/activity record, line " << input.lines_read() << " '" << buffer + << "'\n"; return 0; } } @@ -2078,13 +2026,11 @@ read_id_activity_hash (iwstring_data_source & input, } static int -read_id_activity_hash (const const_IWSubstring & fname, - IW_STL_Hash_Map<IWString, IWString> & id_activity_hash, - int experimental_column) -{ +read_id_activity_hash(const const_IWSubstring& fname, + IW_STL_Hash_Map<IWString, IWString>& id_activity_hash, + int experimental_column) { iwstring_data_source input(fname); - if (! input.good()) - { + if (!input.good()) { cerr << "Cannot open '" << fname << "'\n"; return 0; } @@ -2096,29 +2042,25 @@ read_id_activity_hash (const const_IWSubstring & fname, template <typename T> int -get_comma_separated_values (Command_Line & cl, - const char flag, - resizable_array<T> & v, - const float minval) -{ +get_comma_separated_values(Command_Line& cl, const char flag, resizable_array<T>& v, + const float minval) { const_IWSubstring f; - for (int i = 0; cl.value(flag, f, i); ++i) - { + for (int i = 0; cl.value(flag, f, i); ++i) { int j = 0; const_IWSubstring token; - while (f.nextword(token, j, ',')) - { + while (f.nextword(token, j, ',')) { float x; - if (! token.numeric_value(x) || x <= minval) - { - cerr << "The -" << flag << " must be greater than " << minval << " '" << token << "' invalid\n"; + if (!token.numeric_value(x) || x <= minval) { + cerr << "The -" << flag << " must be greater than " << minval << " '" << token + << "' invalid\n"; return 0; } v.add(x); - if (verbose) - cerr << "Option " << flag << " got value " << x << endl; + if (verbose) { + cerr << "Option " << flag << " got value " << x << '\n'; + } } } @@ -2131,55 +2073,57 @@ get_comma_separated_values (Command_Line & cl, */ static int -identify_most_active_fraction (const IW_STL_Hash_Map<IWString, IWString> & activity, - const double fraction_to_keep, - double & discard_measured_values_below) -{ +identify_most_active_fraction(const IW_STL_Hash_Map<IWString, IWString>& activity, + const double fraction_to_keep, + double& discard_measured_values_below) { const auto s = activity.size(); - float * v = new float[s]; std::unique_ptr<float[]> free_v(v); + float* v = new float[s]; + std::unique_ptr<float[]> free_v(v); int ndx = 0; - for (auto f : activity) - { + for (auto f : activity) { float a; - if (! f.second.numeric_value(a)) + if (!f.second.numeric_value(a)) { continue; + } v[ndx] = a; ndx++; } - std::sort(v, v + ndx); // ascending. Could do a partial sort if we wanted to + std::sort(v, v + ndx); // ascending. Could do a partial sort if we wanted to const int i = static_cast<int>((1.0 - fraction_to_keep) * ndx + 0.4999); discard_measured_values_below = v[i]; - if (verbose) - cerr << "Keeping the " << fraction_to_keep << " most active values, implies an activity cutoff of " << discard_measured_values_below << " (range " << v[0] << " to " << v[ndx-1] << ")\n"; + if (verbose) { + cerr << "Keeping the " << fraction_to_keep + << " most active values, implies an activity cutoff of " + << discard_measured_values_below << " (range " << v[0] << " to " << v[ndx - 1] + << ")\n"; + } return 1; } int -parse_digits (const const_IWSubstring & token, - int istart, - int & zresult) -{ +parse_digits(const const_IWSubstring& token, int istart, int& zresult) { zresult = 0; - int rc = 0; // the number of characters we consume + int rc = 0; // the number of characters we consume - for (int i = istart; i < token.length(); i++) - { + for (int i = istart; i < token.length(); i++) { int j = token[i] - '0'; - if (j > 9) + if (j > 9) { return rc; + } - if (j < 0) + if (j < 0) { return rc; + } zresult = zresult * 10 + j; rc++; @@ -2189,25 +2133,20 @@ parse_digits (const const_IWSubstring & token, } static int -parse_dash_p (const const_IWSubstring & p, - resizable_array<int> & predicted_column) -{ +parse_dash_p(const const_IWSubstring& p, resizable_array<int>& predicted_column) { int i = 0; const_IWSubstring token; - while (p.nextword(token, i, ',')) - { + while (p.nextword(token, i, ',')) { int c1; int chars_consumed = parse_digits(token, 0, c1); - if (chars_consumed == token.length()) - { + if (chars_consumed == token.length()) { predicted_column.add(c1 - 1); continue; } - if ('-' != token[chars_consumed]) - { + if ('-' != token[chars_consumed]) { cerr << "Ranges must be of the form 'n-m'\n"; return 0; } @@ -2216,15 +2155,13 @@ parse_dash_p (const const_IWSubstring & p, int chars_consumed_2 = parse_digits(token, chars_consumed + 1, c2); - if (chars_consumed + 1 + chars_consumed_2 != token.length()) - { + if (chars_consumed + 1 + chars_consumed_2 != token.length()) { cerr << "Invalid range specifier '" << token << "'\n"; usage(6); } - for (int j = c1; j <= c2; j++) - { - predicted_column.add(j -1); + for (int j = c1; j <= c2; j++) { + predicted_column.add(j - 1); } } @@ -2232,23 +2169,19 @@ parse_dash_p (const const_IWSubstring & p, } static int -iwstats (int argc, char ** argv) -{ +iwstats(int argc, char** argv) { Command_Line cl(argc, argv, "ve:E:p:s:jwn:t:P:M:qR:zc:TA:b:hr:ko:a:f:u:U:i:Km:dF:D:L:"); - if (cl.unrecognised_options_encountered()) - { + if (cl.unrecognised_options_encountered()) { cerr << "unrecognised_options_encountered\n"; usage(3); } verbose = cl.option_count('v'); - if (cl.option_present('i')) - { + if (cl.option_present('i')) { IWString i = cl.string_value('i'); - if (! char_name_to_char(i)) - { + if (!char_name_to_char(i)) { cerr << "Unrecognised input separator specification '" << i << "'\n"; return 2; } @@ -2256,382 +2189,372 @@ iwstats (int argc, char ** argv) input_separator = i[0]; } - if (cl.option_present('j')) - { + if (cl.option_present('j')) { is_descriptor_file = 1; - if (verbose) + if (verbose) { cerr << "Will process as a descriptor file\n"; + } } int experimental_column = -1; - if (cl.option_present('e')) - { - if (! cl.value('e', experimental_column) || experimental_column < 1) - { - cerr << "The experimental/measured value column (-e) must be a whole positive number\n"; + if (cl.option_present('e')) { + if (!cl.value('e', experimental_column) || experimental_column < 1) { + cerr << "The experimental/measured value column (-e) must be a whole positive " + "number\n"; usage(4); } - if (verbose) - cerr << "Experimental/Measured values in column " << experimental_column << endl; + if (verbose) { + cerr << "Experimental/Measured values in column " << experimental_column << '\n'; + } experimental_column--; } - if (cl.option_present('E')) - { + if (cl.option_present('E')) { const_IWSubstring e = cl.string_value('E'); - if (cl.option_present('z')) - { + if (cl.option_present('z')) { strip_leading_zeros_from_identifiers = 1; - if (verbose) + if (verbose) { cerr << "Will strip leading 0's from identifiers\n"; + } } - if (! read_id_activity_hash(e, id_activity_hash, experimental_column) || 0 == id_activity_hash.size()) - { + if (!read_id_activity_hash(e, id_activity_hash, experimental_column) || + 0 == id_activity_hash.size()) { cerr << "Cannot read id/activity hash from '" << e << "'\n"; return 5; } - if (verbose) - cerr << "Read " << id_activity_hash.size() << " activity values from '" << e << "'\n"; + if (verbose) { + cerr << "Read " << id_activity_hash.size() << " activity values from '" << e + << "'\n"; + } is_descriptor_file = 1; - experimental_column = 0; // activity data has come from a separate file, don't go looking for it in the input file + experimental_column = 0; // activity data has come from a separate file, don't go + // looking for it in the input file - if (! cl.option_present('p')) - { + if (!cl.option_present('p')) { cerr << "Must specify one or more predicted columns via the -p option\n"; usage(5); } } - if (cl.option_present('c')) - { - if (! cl.value('c', values_needed_for_reporting_correlations) || values_needed_for_reporting_correlations < 3) - { - cerr << "The number of pairs needed for correlation compuations (-c) must be 3 or larger\n"; + if (cl.option_present('c')) { + if (!cl.value('c', values_needed_for_reporting_correlations) || + values_needed_for_reporting_correlations < 3) { + cerr << "The number of pairs needed for correlation compuations (-c) must be 3 or " + "larger\n"; usage(4); } - if (verbose) - cerr << "Correlations only done when at least " << values_needed_for_reporting_correlations << " data points available\n"; + if (verbose) { + cerr << "Correlations only done when at least " + << values_needed_for_reporting_correlations << " data points available\n"; + } } resizable_array<int> predicted_column; - if (cl.option_present('p')) - { + if (cl.option_present('p')) { int i = 0; const_IWSubstring p; - while (cl.value('p', p, i++)) - { - if (! parse_dash_p(p, predicted_column)) - { + while (cl.value('p', p, i++)) { + if (!parse_dash_p(p, predicted_column)) { cerr << "Invalid predicted column(s) specifier '" << p << "'\n"; usage(6); } } - if (predicted_column.contains(experimental_column)) - { - cerr << "Column " << experimental_column << " cannot be both predicted and experimental\n"; + if (predicted_column.contains(experimental_column)) { + cerr << "Column " << experimental_column + << " cannot be both predicted and experimental\n"; return 8; } } - if (experimental_column < 0 && predicted_column.empty()) - { - if (is_descriptor_file) + if (experimental_column < 0 && predicted_column.empty()) { + if (is_descriptor_file) { experimental_column = -1; - else + } else { experimental_column = 0; + } } - if (verbose) - { - if (experimental_column >= 0) - cerr << "Measured/Observed values in column " << (experimental_column + 1) << endl; + if (verbose) { + if (experimental_column >= 0) { + cerr << "Measured/Observed values in column " << (experimental_column + 1) << '\n'; + } - if (predicted_column.number_elements()) - { + if (predicted_column.number_elements()) { cerr << "Predicted values in columns"; - for (int i = 0; i < predicted_column.number_elements(); i++) - { + for (int i = 0; i < predicted_column.number_elements(); i++) { cerr << ' ' << (predicted_column[i] + 1); } - cerr << endl; + cerr << '\n'; } } - if (predicted_column.empty()) + if (predicted_column.empty()) { predicted_column.add(-1); + } - if (cl.option_present('h')) - { + if (cl.option_present('h')) { traditional_q2_definition = 1; - if (verbose) + if (verbose) { cerr << "Will report traditional Q2 definitions\n"; + } } - if (cl.option_present('q') && ! cl.option_present('M')) - { - cerr << "Sorry, the no-report missing values option (-q) only makes sense with the -M option\n"; + if (cl.option_present('q') && !cl.option_present('M')) { + cerr << "Sorry, the no-report missing values option (-q) only makes sense with the " + "-M option\n"; usage(2); } - if (cl.option_present('M')) - { + if (cl.option_present('M')) { missing_value = cl.string_value('M'); - if (verbose) + if (verbose) { cerr << "Missing value set to '" << missing_value << "'\n"; + } - if (cl.option_present('q')) - { + if (cl.option_present('q')) { report_missing_values = 0; - if (verbose) + if (verbose) { cerr << "Will quietly ignore missing values\n"; + } } } - if (cl.option_present('r')) - { - if (! cl.value('r', relative_error_threshold) || relative_error_threshold <= static_cast<float>(0.0)) - { - cerr << "The max relative error (-r) option must be a non zero, positive floating point value\n"; + if (cl.option_present('r')) { + if (!cl.value('r', relative_error_threshold) || + relative_error_threshold <= static_cast<float>(0.0)) { + cerr << "The max relative error (-r) option must be a non zero, positive floating " + "point value\n"; usage(2); } - if (verbose) - cerr << "Relative error computation threshold " << relative_error_threshold << endl; + if (verbose) { + cerr << "Relative error computation threshold " << relative_error_threshold << '\n'; + } - range_normal_relative_error = 1; // turn on by default + range_normal_relative_error = 1; // turn on by default } - if (cl.option_present('s')) - { - if (! cl.value('s', records_to_skip) || records_to_skip < 1) - { - cerr << "The number of records to skip (-s option) must be a whole positive number\n"; - usage (5); + if (cl.option_present('s')) { + if (!cl.value('s', records_to_skip) || records_to_skip < 1) { + cerr << "The number of records to skip (-s option) must be a whole positive " + "number\n"; + usage(5); } - if (verbose) + if (verbose) { cerr << "Will skip the first " << records_to_skip << " records\n"; + } } - if (is_descriptor_file) - { - if (records_to_skip < 1) + if (is_descriptor_file) { + if (records_to_skip < 1) { records_to_skip = 1; + } - if (0 == experimental_column && ! cl.option_present('E')) - { + if (0 == experimental_column && !cl.option_present('E')) { cerr << "Descriptor file, but you gave the experimental column as 1, sorry...\n"; usage(7); } - if (predicted_column.contains(0)) - { + if (predicted_column.contains(0)) { cerr << "Descriptor file but you said predicted values in column 1. Sorry\n"; usage(8); } } - if (cl.option_present('k')) - { + if (cl.option_present('k')) { skip_items_with_no_activity_data = cl.option_count('k'); - if (verbose) + if (verbose) { cerr << "Will skip items where there is no experimental data\n"; + } } - if (cl.option_present('K')) - { + if (cl.option_present('K')) { wikipedia_r2_definition = 0; - if (verbose) + if (verbose) { cerr << "Will use R2 definition\n"; + } } - if (cl.option_present('w')) - { + if (cl.option_present('w')) { compute_range_of_bsquared_values_when_duplicates_present = 0; - if (verbose) + if (verbose) { cerr << "Will suppress computation of best and worst BSquared values\n"; + } } - int n = (cl.option_present('n') > 0) + (cl.option_present('t') > 0) + (cl.option_present('P') > 0); + int n = (cl.option_present('n') > 0) + (cl.option_present('t') > 0) + + (cl.option_present('P') > 0); - if (n > 1) - { - cerr << "Hmmm, you have specified more than one of: a constant step (-t) percent sample (-P) or number (-n)\n"; + if (n > 1) { + cerr << "Hmmm, you have specified more than one of: a constant step (-t) percent " + "sample (-P) or number (-n)\n"; cerr << "options. Might be a little strange....\n"; -// cerr << cl.option_present('n') << ' ' << cl.option_present('t') << ' ' << cl.option_present('P') << ' ' << n << endl; + // cerr << cl.option_present('n') << ' ' << cl.option_present('t') << ' ' << + // cl.option_present('P') << ' ' << n << '\n'; } - if (cl.option_present('n')) - { + if (cl.option_present('n')) { int i = 0; const_IWSubstring n; - while (cl.value('n', n, i++)) - { + while (cl.value('n', n, i++)) { int j; - if (! n.numeric_value(j) || j < 2) - { + if (!n.numeric_value(j) || j < 2) { cerr << "Invalid number of records to process '" << n << "'\n"; usage(4); } N_to_check.add_if_not_already_present(j); - if (verbose) + if (verbose) { cerr << "Will examine highest predicted " << j << " records in the file\n"; + } } } - if (cl.option_present('t')) - { - if (! cl.value('t', step) || step < 1) - { + if (cl.option_present('t')) { + if (!cl.value('t', step) || step < 1) { cerr << "The step every option (-t) must be a whole positive number\n"; usage(11); } - if (verbose) - cerr << "Will compute Bsquared values for " << step << " sized sections of the data\n"; + if (verbose) { + cerr << "Will compute Bsquared values for " << step + << " sized sections of the data\n"; + } } - if (cl.option_present('P')) - { + if (cl.option_present('P')) { int i = 0; int p; - while (cl.value('P', p, i++)) - { - if (p <= 0 || p > 100) - { + while (cl.value('P', p, i++)) { + if (p <= 0 || p > 100) { cerr << "Percentages must be between 1 and 100, '" << p << "' is invalid\n"; usage(7); } - if (verbose) + if (verbose) { cerr << "Will report the first " << p << " percent of the data\n"; + } percents_to_check.add_if_not_already_present(p); } } - if (cl.option_present('A')) - { + if (cl.option_present('A')) { int i = 0; float a; - while (cl.value('A', a, i++)) - { - if (verbose) + while (cl.value('A', a, i++)) { + if (verbose) { cerr << "Will report activities above " << a << "\n"; + } activities_to_check.add_if_not_already_present(a); } } - if (cl.option_present('T')) - { + if (cl.option_present('T')) { truncate_predicted_values_to_experimental_range = 1; - if (verbose) + if (verbose) { cerr << "Predicted values truncated to experimental range\n"; + } } - if (cl.option_present('b')) - { - if (! cl.value('b', number_distribution_buckets) || number_distribution_buckets < 2) - { - cerr << "The number of buckets for distribution studies (-b) must be a whole +ve number\n"; + if (cl.option_present('b')) { + if (!cl.value('b', number_distribution_buckets) || number_distribution_buckets < 2) { + cerr << "The number of buckets for distribution studies (-b) must be a whole +ve " + "number\n"; usage(5); } - if (verbose) - cerr << "Will report distribution in " << number_distribution_buckets << " buckets\n"; + if (verbose) { + cerr << "Will report distribution in " << number_distribution_buckets + << " buckets\n"; + } } - - if (cl.option_present('o')) - { - if (! cl.value('o',active_inactive_cutoff) ) - { + + if (cl.option_present('o')) { + if (!cl.value('o', active_inactive_cutoff)) { cerr << "Invalid cutoff for active/inactive \n"; usage(5); } calculate_enrichment_metrics = 1; - if (verbose) - cerr<< "Will calculate enrichment metrics, such as BEDROC and EF \n"; - - if(cl.option_present('a')) - { - if(! cl.value('a',bedroc_alpha)) - { - cerr << "Invalid value for BEDROC alpha \n"; - usage(5); + if (verbose) { + cerr << "Will calculate enrichment metrics, such as BEDROC and EF \n"; + } + + if (cl.option_present('a')) { + if (!cl.value('a', bedroc_alpha)) { + cerr << "Invalid value for BEDROC alpha \n"; + usage(5); } } - if (cl.option_present('f')) - { - if (! cl.value('f', enrichment_factor_fraction) || enrichment_factor_fraction <= 0.0 || enrichment_factor_fraction >= 1.0) - { + if (cl.option_present('f')) { + if (!cl.value('f', enrichment_factor_fraction) || + enrichment_factor_fraction <= 0.0 || enrichment_factor_fraction >= 1.0) { cerr << "The enrichment factor fraction (-f) must be a valid fraction\n"; usage(2); } } } - if (cl.option_present('u') && cl.option_present('U')) - { + if (cl.option_present('u') && cl.option_present('U')) { cerr << "Cannot use both the -u and -U options\n"; usage(1); } - if (cl.option_present('u')) - { - if (! cl.value('u', discard_measured_values_below)) - { + if (cl.option_present('u')) { + if (!cl.value('u', discard_measured_values_below)) { cerr << "The discard measured values below option (-u) must be a valid float\n"; usage(2); } - if (verbose) - cerr << "Will discard measured values below " << discard_measured_values_below << endl; + if (verbose) { + cerr << "Will discard measured values below " << discard_measured_values_below + << '\n'; + } } -/* - We use the -u mechanism in order to implement the -U functionality. Just identify the - cut point of activity that holds the -U fraction of molecules -*/ + /* + We use the -u mechanism in order to implement the -U functionality. Just identify the + cut point of activity that holds the -U fraction of molecules + */ - if (cl.option_present('U')) - { + if (cl.option_present('U')) { double u; - if (! cl.value('U', u) || u <= 0.0 || u >= 1.0) - { - cerr << "The fraction of most active to retain (-U) option must be a valid fraction\n"; + if (!cl.value('U', u) || u <= 0.0 || u >= 1.0) { + cerr << "The fraction of most active to retain (-U) option must be a valid " + "fraction\n"; usage(2); } - if (verbose) + if (verbose) { cerr << "Will only keep the most " << u << " active molecules\n"; + } identify_most_active_fraction(id_activity_hash, u, discard_measured_values_below); } - - if (cl.option_present('R')) - { + + if (cl.option_present('R')) { const_IWSubstring r = cl.string_value('R'); if ('.' == r) { @@ -2641,30 +2564,26 @@ iwstats (int argc, char ** argv) randomise_ties = 1; - if (verbose) + if (verbose) { cerr << "Randomise tied predicted values\n"; + } } - if (cl.option_present('F')) - { - if (! get_comma_separated_values(cl, 'F', fold_difference_multiplicative, 1.0f)) - { + if (cl.option_present('F')) { + if (!get_comma_separated_values(cl, 'F', fold_difference_multiplicative, 1.0f)) { cerr << "Cannot parse multiplicative -Nfold option (-F)\n"; return 1; } } - if (cl.option_present('D')) - { - if (! get_comma_separated_values(cl, 'D', fold_difference_additive, 0.0f)) - { + if (cl.option_present('D')) { + if (!get_comma_separated_values(cl, 'D', fold_difference_additive, 0.0f)) { cerr << "Cannot parse additive -Nfold option (-D)\n"; return 1; } } - if (experimental_column < 0 && predicted_column.number_elements() >= 0) - { + if (experimental_column < 0 && predicted_column.number_elements() >= 0) { cerr << "No experimental column specified, cannot proceed\n"; usage(4); } @@ -2672,112 +2591,108 @@ iwstats (int argc, char ** argv) int marker_column = -1; IWString marker_column_name; - if (cl.option_present('m')) - { + if (cl.option_present('m')) { IWString m = cl.string_value('m'); - if (m.numeric_value(marker_column)) - { - if (marker_column < 1) - { + if (m.numeric_value(marker_column)) { + if (marker_column < 1) { cerr << "The marker column option must be a valid column number\n"; usage(1); } - if (verbose) - cerr << "Marker column set to " << marker_column << endl; + if (verbose) { + cerr << "Marker column set to " << marker_column << '\n'; + } marker_column--; - } - else - { + } else { marker_column_name = m; is_descriptor_file = 1; - if (records_to_skip <= 0) + if (records_to_skip <= 0) { records_to_skip = 1; + } - if (verbose) + if (verbose) { cerr << "The marker column will be descriptor '" << marker_column_name << "'\n"; + } } } - if (cl.option_present('d')) - { + if (cl.option_present('d')) { do_cMSD = 1; - if (verbose) + if (verbose) { cerr << "Compute cMSD rather than cMSR\n"; + } } - if (cl.empty()) - { + if (cl.empty()) { cerr << "INsufficient arguments\n"; usage(1); } - if (cl.option_present('L')) - { - const char * fname = cl.option_value('L'); + if (cl.option_present('L')) { + const char* fname = cl.option_value('L'); - if (! stream_for_residuals.open(fname)) - { + if (!stream_for_residuals.open(fname)) { cerr << "Cannot open stream for residuals '" << fname << "'\n"; return 1; } - if (verbose) + if (verbose) { cerr << "Residuals written to '" << fname << "'\n"; + } } int rc = 0; - for (int i = 0; i < cl.number_elements(); i++) - { + for (int i = 0; i < cl.number_elements(); i++) { resizable_array_p<Predicted_Values> zdata(2000); - if (! read_the_data(cl[i], experimental_column, predicted_column, marker_column, marker_column_name, zdata)) - { + if (!read_the_data(cl[i], experimental_column, predicted_column, marker_column, + marker_column_name, zdata)) { cerr << "Error reading data file '" << cl[i] << "'\n"; rc = i + 1; break; } - if (verbose) - cerr << "Read " << zdata.number_elements() << " data items from '" << cl[i] << "'\n"; + if (verbose) { + cerr << "Read " << zdata.number_elements() << " data items from '" << cl[i] + << "'\n"; + } - if (verbose > 2) + if (verbose > 2) { echo_the_data(zdata, cerr); + } - if (1 == zdata.number_elements()) - { + if (1 == zdata.number_elements()) { cerr << "Very strange, only one record in '" << cl[i] << "', ignored\n"; continue; } - if (! iwstats(predicted_column, experimental_column, zdata, cout)) - { + if (!iwstats(predicted_column, experimental_column, zdata, cout)) { cerr << "Fatal error processing '" << cl[i] << "'\n"; rc = i + 1; break; } - if (marker_column >= 0) - { + if (marker_column >= 0) { IW_STL_Hash_Map_int markers_present; gather_markers(zdata, markers_present); - if (verbose) + if (verbose) { cerr << "Found " << markers_present.size() << " different marker values\n"; + } - for (auto j = markers_present.begin(); j != markers_present.end(); ++j) - { - if ((*j).second < 3) + for (auto j = markers_present.begin(); j != markers_present.end(); ++j) { + if ((*j).second < 3) { continue; + } cout << "By " << (*j).first << "\n"; - if (! iwstats(j, predicted_column, experimental_column, zdata, cout)) - { - cerr << "Fatal error processing marker '" << (*j).first << " in '" << cl[i] << "'\n"; + if (!iwstats(j, predicted_column, experimental_column, zdata, cout)) { + cerr << "Fatal error processing marker '" << (*j).first << " in '" << cl[i] + << "'\n"; rc = i + 1; break; } @@ -2785,21 +2700,24 @@ iwstats (int argc, char ** argv) } } - if (missing_values_encountered) + if (missing_values_encountered) { cerr << "Encountered " << missing_values_encountered << " missing values\n"; + } - if (items_with_no_activity_data) - cerr << "Encountered " << items_with_no_activity_data << " items with no activity data\n"; + if (items_with_no_activity_data) { + cerr << "Encountered " << items_with_no_activity_data + << " items with no activity data\n"; + } - if (nullptr != column_titles) - delete [] column_titles; + if (nullptr != column_titles) { + delete[] column_titles; + } return rc; } int -main (int argc, char ** argv) -{ +main(int argc, char** argv) { int rc = iwstats(argc, argv); return rc; diff --git a/src/Utilities/General/BUILD b/src/Utilities/General/BUILD index 48a6b513..f818bfd0 100644 --- a/src/Utilities/General/BUILD +++ b/src/Utilities/General/BUILD @@ -23,7 +23,6 @@ local_install( ":difference_sort", ":diff_line_by_line", ":distribution", - ":enough_inventory_bdb", ":feature_scaling", ":fetch_sdf", ":fetch_sdf_quick", @@ -386,22 +385,6 @@ cc_binary( ], ) -cc_binary( - name = "enough_inventory_bdb", - srcs = [ - "enough_inventory_bdb.cc", - ], - tags = ["berkeleydb"], - deps = [ - "//Foundational/accumulator:accumulator", - "//Foundational/cmdline:iwcmdline", - "//Foundational/data_source:iwstring_data_source", - "//Foundational/iwmisc:iwmisc", - "//Foundational/iw_tdt:iw_tdt", - "@berkeleydb", - ], -) - cc_binary( name = "feature_scaling", srcs = [ diff --git a/src/Utilities/General/Makefile b/src/Utilities/General/Makefile deleted file mode 100644 index 64204b82..00000000 --- a/src/Utilities/General/Makefile +++ /dev/null @@ -1,201 +0,0 @@ - -# Copyright 2018 Eli Lilly and Company -# -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -######################################################################## -IWPROGRAMMES ?= $(PWD)/../../.. -BUILD_DIR ?= . -UNAME ?= Linux-gcc-6.2.0 -include $(IWPROGRAMMES)/makefile.public.$(UNAME) - -########################## Shared variables ############################ -LIBS = $(LIB) -lcmdline -liwrandom -laccumulator\ - -liwstring_data_source -liwcrex -liwstring \ - -liwbits $(LIBZ) -liwaray - -# If we are using the new command line object -NCLIBS = $(LIB) -lcmdline_v2 -liwmisc -liwrandom -laccumulator\ - -liwstring_data_source -liwcrex -liwstring \ - -liwbits -liwaray\ - $(LIBZ) $(USRLIB) - -$(BUILD_DIR)/%.o : %.cc - $(CXX) -c -o $@ $< $(CXX_FLAGS_WITH_IMPLICIT_TEMPLATES) -########################## Template for libary ######################### -# Change the project name -PROJECT_NAME = iwnormalisation - -LIBRARY_OBJECTS_LIST = normalisation.o - -SHARED_INC_FILES = normalisation.h - -LIBRARY_OBJECTS = $(addprefix $(BUILD_DIR)/, $(LIBRARY_OBJECTS_LIST)) - -LIBRARY_STEM = lib$(PROJECT_NAME) - -LIBRARY_NAME = $(BUILD_DIR)/$(LIBRARY_STEM).a - -# Rule for making library obj -$(LIBRARY_OBJECTS): - $(CXX) -c $(CXX_FLAGS_WITH_IMPLICIT_TEMPLATES) $(basename $(notdir $@)).cc -o $@ - -# Rule for making library -$(LIBRARY_NAME): $(LIBRARY_OBJECTS) - $(AR) r $@ $(LIBRARY_OBJECTS) - -################# Template for public executables ###################### -UNIQUE_ROWS_EXE = $(BUILD_DIR)/unique_rows -UNIQUE_ROWS_OBJECTS = $(BUILD_DIR)/unique_rows.o $(BUILD_DIR)/iwtokeniser.o -$(BUILD_DIR)/unique_rows: $(UNIQUE_ROWS_OBJECTS) - $(LD) -o $@ $(LDFLAGS) $(PROF) $(UNIQUE_ROWS_OBJECTS) $(NCLIBS) $(SYSTEM_LIBS) $(IWMALLOC) -EXECUTABLES += $(UNIQUE_ROWS_EXE) - -################# Template for public executables ###################### -IWCUT_EXE = $(BUILD_DIR)/iwcut -IWCUT_OBJECTS = $(BUILD_DIR)/iwcut.o -$(BUILD_DIR)/iwcut: $(IWCUT_OBJECTS) - $(LD) -o $@ $(IWCUT_OBJECTS) $(LIBS) -lcmdline -liwstring_data_source -liwmisc -liwstring -liwcrex -liwaray $(SYSTEM_LIBS) -EXECUTABLES += $(IWCUT_EXE) - -################# Template for public executables ###################### -FSQ_EXE = $(BUILD_DIR)/fetch_smiles_quick -FSQ_OBJECTS = $(BUILD_DIR)/fetch_smiles_quick.o -$(BUILD_DIR)/fetch_smiles_quick: $(FSQ_OBJECTS) - $(LD) -o $@ $(LDFLAGS) $(PROF) $(FSQ_OBJECTS) $(LIBS) -liwmisc $(SYSTEM_LIBS) -EXECUTABLES += $(FSQ_EXE) - -################# Template for public executables ###################### -CONCAT_FILES_EXE = $(BUILD_DIR)/concat_files -CONCAT_FILES_OBJECTS = $(BUILD_DIR)/concat_files.o $(BUILD_DIR)/iwtokeniser.o -$(BUILD_DIR)/concat_files: $(CONCAT_FILES_OBJECTS) - $(LD) -o $@ $(CONCAT_FILES_OBJECTS) $(LIBS) -liwstring -lcmdline -liwstring_data_source -liwcrex -liwstring -liwaray -liwmisc $(SYSTEM_LIBS) -EXECUTABLES += $(CONCAT_FILES_EXE) - -################# Template for public executables ###################### -DESCRIPTORS_TO_FINGERPRINT_EXE = $(BUILD_DIR)/descriptors_to_fingerprint -DESCRIPTORS_TO_FINGERPRINT_OBJECTS = $(BUILD_DIR)/descriptors_to_fingerprint.o -$(BUILD_DIR)/descriptors_to_fingerprint: $(DESCRIPTORS_TO_FINGERPRINT_OBJECTS) - $(LD) -o $@ $(PROF) $(DESCRIPTORS_TO_FINGERPRINT_OBJECTS) $(LIBS) -lsparsefp -liwmisc -liwbits $(SYSTEM_LIBS) -EXECUTABLES += $(DESCRIPTORS_TO_FINGERPRINT_EXE) - -################# Template for public executables ###################### -AVERAGE_EXE = $(BUILD_DIR)/average -AVERAGE_OBJECTS = $(BUILD_DIR)/average.o $(BUILD_DIR)/iwtokeniser.o -$(BUILD_DIR)/average: $(AVERAGE_OBJECTS) - $(LD) -o $@ $(LDFLAGS) $(PROF) $(AVERAGE_OBJECTS) -liwmisc $(LIBS) $(SYSTEM_LIBS) $(IWMALLOC) -EXECUTABLES += $(AVERAGE_EXE) - -################# Template for public executables ###################### -DFILEFILTER_EXE = $(BUILD_DIR)/dfilefilter -DFILEFILTER_OBJECTS = $(BUILD_DIR)/dfilefilter.o -$(BUILD_DIR)/dfilefilter: $(DFILEFILTER_OBJECTS) - $(LD) -o $@ $(DFILEFILTER_OBJECTS) $(LIBS) -liwmisc -EXECUTABLES += $(DFILEFILTER_EXE) - -################# Template for public executables ###################### -DISTRIBUTION_EXE = $(BUILD_DIR)/distribution -DISTRIBUTION_OBJECTS = $(BUILD_DIR)/distribution.o -$(BUILD_DIR)/distribution: $(DISTRIBUTION_OBJECTS) - $(LD) -o $@ $(DISTRIBUTION_OBJECTS) $(LIBS) -liwmisc $(SYSTEM_LIBS) -EXECUTABLES += $(DISTRIBUTION_EXE) - -################# Template for public executables ###################### -FETCH_SDF_QUICK_EXE = $(BUILD_DIR)/fetch_sdf_quick -FETCH_SDF_QUICK_OBJECTS = $(BUILD_DIR)/fetch_sdf_quick.o -$(BUILD_DIR)/fetch_sdf_quick: $(FETCH_SDF_QUICK_OBJECTS) - $(LD) -o $@ $(LDFLAGS) $(PROF) $(FETCH_SDF_QUICK_OBJECTS) $(LIBS) -liwmisc $(SYSTEM_LIBS) -EXECUTABLES += $(FETCH_SDF_QUICK_EXE) - -################# Template for public executables ###################### -IWSPLIT_EXE = $(BUILD_DIR)/iwsplit -IWSPLIT_OBJECTS = $(BUILD_DIR)/iwsplit.o -$(BUILD_DIR)/iwsplit: $(IWSPLIT_OBJECTS) - $(LD) -o $@ $(PROF) $(IWSPLIT_OBJECTS) $(NCLIBS) -liwmisc -liwcrex $(SYSTEM_LIBS) $(LIBZ) -EXECUTABLES += $(IWSPLIT_EXE) - -################# Template for public executables ###################### -NORMALISE_EXE = $(BUILD_DIR)/normalise -NORMALISE_OBJECTS = $(BUILD_DIR)/normalise.o -$(BUILD_DIR)/normalise: $(NORMALISE_OBJECTS) - $(LD) -o $@ $(LDFLAGS) $(NORMALISE_OBJECTS) $(LIBS) -liwmisc $(LIBTEMPLATE) $(SYSTEM_LIBS) -EXECUTABLES += $(NORMALISE_EXE) - -################# Template for public executables ###################### -NENV_EXE = $(BUILD_DIR)/notenoughvariance -NENV_OBJECTS = $(BUILD_DIR)/notenoughvariance.o -$(BUILD_DIR)/notenoughvariance: $(NENV_OBJECTS) - $(LD) -o $@ $(LDFLAGS) $(NENV_OBJECTS) $(LIBS) $(LIBTEMPLATE) $(SYSTEM_LIBS) -EXECUTABLES += $(NENV_EXE) - -################# Template for public executables ###################### -RANDOM_RECORDS_EXE = $(BUILD_DIR)/random_records -RANDOM_RECORDS_OBJECTS = $(BUILD_DIR)/random_records.o -$(BUILD_DIR)/random_records: $(RANDOM_RECORDS_OBJECTS) - $(LD) -o $@ $(RANDOM_RECORDS_OBJECTS) $(LIBS) -laccumulator -lcmdline -liwstring_data_source -liwstring -liwcrex -liwaray $(SYSTEM_LIBS) -EXECUTABLES += $(RANDOM_RECORDS_EXE) - -################# Template for public executables ###################### -TCOUNT_EXE = $(BUILD_DIR)/tcount -TCOUNT_OBJECTS = $(BUILD_DIR)/tcount.o $(BUILD_DIR)/tokens_in_quoted_string.o -$(BUILD_DIR)/tcount: $(TCOUNT_OBJECTS) - $(LD) -o $@ $(LDFLAGS) $(PROF) $(TCOUNT_OBJECTS) $(LIBS) $(LIBTEMPLATE) $(SYSTEM_LIBS) -EXECUTABLES += $(TCOUNT_EXE) - -################# Template for public executables ###################### -WHATSMISSING_EXE = $(BUILD_DIR)/whatsmissing -WHATSMISSING_OBJECTS = $(BUILD_DIR)/whatsmissing.o -$(BUILD_DIR)/whatsmissing: $(WHATSMISSING_OBJECTS) - $(LD) -o $@ $(LDFLAGS) $(PROF) $(WHATSMISSING_OBJECTS) $(LIBS) -liwmisc $(SYSTEM_LIBS) $(IWMALLOC) -EXECUTABLES += $(WHATSMISSING_EXE) - -################# Template for public executables ###################### -REARRANGE_COLUMNS_EXE = $(BUILD_DIR)/rearrange_columns -REARRANGE_COLUMNS_OBJECTS = $(BUILD_DIR)/rearrange_columns.o $(BUILD_DIR)/valid_descriptor_name.o -$(BUILD_DIR)/rearrange_columns: $(REARRANGE_COLUMNS_OBJECTS) - $(LD) -o $@ $(REARRANGE_COLUMNS_OBJECTS) $(LIBS) -lcmdline -liwstring_data_source -liwstring -liwcrex -liwaray -EXECUTABLES += $(REARRANGE_COLUMNS_EXE) - - -###################### Template for build command ###################### -.PHONY: copy_include -.PHONY: library -.PHONY: copy_library -.PHONY: exe -.PHONY: copy_exe -.PHONY: clean -.PHONY: veryclean - -copy_include: - $(CP) $(SHARED_INC_FILES) $(INCDIR) - -# Rule for making static library -library: $(LIBRARY_NAME) - -# Rule for installing static library -copy_library: copy_include library - $(CP) $(LIBRARY_NAME) $(LIBDIR) - -# Rule for making executables -exe: $(EXECUTABLES) - -# Rule for install executables -copy_exe: exe - $(CP) $(EXECUTABLES) $(EXEDIR) - -clean: - @$(RM) $(BUILD_DIR)/*.o || true - -veryclean: clean - @$(RM) $(BUILD_DIR)/*.a || true - @$(RM) $(EXECUTABLES) || true diff --git a/src/Utilities/General/average.cc b/src/Utilities/General/average.cc index 66da3f69..aaf5effe 100644 --- a/src/Utilities/General/average.cc +++ b/src/Utilities/General/average.cc @@ -697,7 +697,7 @@ build_regular_expression_from_components(Command_Line& cl, char flag) { tmp << ")$"; re2::StringPiece string_piece(tmp.data(), tmp.length()); - return std::move(std::make_unique<re2::RE2>(string_piece)); + return std::make_unique<re2::RE2>(string_piece); } static int diff --git a/src/Utilities/General/descriptor_file_to_svm_lite.cc b/src/Utilities/General/descriptor_file_to_svm_lite.cc index bfc620a2..8c9f001a 100644 --- a/src/Utilities/General/descriptor_file_to_svm_lite.cc +++ b/src/Utilities/General/descriptor_file_to_svm_lite.cc @@ -56,15 +56,16 @@ usage(int rc) #endif // clang-format on // clang-format off - cerr << "Converts a descriptor file to the form needed by svm-lite\n"; - cerr << " -A <fname> activity file\n"; - cerr << " -H <fname> write the descriptor file header to <fname>\n"; - cerr << " -e processing a test set, no -A file needed\n"; - cerr << " -U <fname> check descriptors are in <fname> - created with -H option\n"; - cerr << " -z strip leading zero's when comparing identifiers\n"; - cerr << " -C activity data is categorical - skip numeric conversion\n"; - cerr << " -t <tol> ignore values within <tol> of zero\n"; - cerr << " -v verbose output\n"; + cerr << R"(Converts a descriptor file to the form needed by svm-lite\n"; + -A <fname> activity file + -e processing a test set, no -A file needed + -H <fname> write the descriptor file header to <fname> + -U <fname> check descriptors are in <fname> - created with -H option + -z strip leading zero's when comparing identifiers + -C activity data is categorical - skip numeric conversion + -t <tol> ignore values within <tol> of zero + -v verbose output +)"; // clang-format on exit(rc); @@ -424,6 +425,7 @@ descriptor_file_to_svm_lite(int argc, char** argv) verbose = cl.option_count('v'); + // There must be just one source of experimental data. int n = 0; if (cl.option_present('e')) { n++; @@ -492,7 +494,6 @@ descriptor_file_to_svm_lite(int argc, char** argv) if (cl.option_present('A')) { const_IWSubstring a = cl.string_value('A'); - if (!read_activity_data(a, id_to_activity)) { cerr << "Cannot read activity data in '" << a << "'\n"; return 4; @@ -522,7 +523,7 @@ descriptor_file_to_svm_lite(int argc, char** argv) } } - if (0 == cl.number_elements()) { + if (cl.empty()) { cerr << "Insufficient arguments\n"; usage(2); } diff --git a/src/Utilities/General/notenoughvariance.cc b/src/Utilities/General/notenoughvariance.cc index 916ca7b9..f63558c3 100644 --- a/src/Utilities/General/notenoughvariance.cc +++ b/src/Utilities/General/notenoughvariance.cc @@ -949,7 +949,10 @@ value_count<T>::_can_collapse_to_binary(T & v1, int & c1, T & v2, int & c2) cons if (binary_density < binary_collapse_threshold) // cannot be collapsed return 0; -// We must now combine the one or two minor values with one of the two major values + // We must now combine the one or two minor values with one of the two major values + // TODO:ianwatson implement this sometime + + (void) v4; // keep the compiler quiet until this gets implemented. return 1; } diff --git a/src/Utilities/General/running_average.cc b/src/Utilities/General/running_average.cc index 68efd011..4c06338a 100644 --- a/src/Utilities/General/running_average.cc +++ b/src/Utilities/General/running_average.cc @@ -38,8 +38,6 @@ static int report_min_and_max = 0; static IWString* ids_this_chunk = NULL; -static int write_header_record = 0; - static void usage(int rc) { @@ -64,12 +62,6 @@ usage(int rc) exit(rc); } -static int -do_write_header_record(std::ostream& os) -{ - return 1; -} - static int write_centre_id(const IWString* ids_this_chunk, int records_read_this_chunk, std::ostream& output) diff --git a/src/Utilities/General/shuffle_file.cc b/src/Utilities/General/shuffle_file.cc index 6aaefdb5..d0ad4b38 100644 --- a/src/Utilities/General/shuffle_file.cc +++ b/src/Utilities/General/shuffle_file.cc @@ -154,8 +154,6 @@ shuffle_file(iwstring_data_source & input, sb.resize(10000); - size_t o = input.tellg(); - if (iwcrex_end_of_group) gather_offsets_regexp_defines_group_end(input, iwcrex_end_of_group, sb); else if (1 == lines_per_group) diff --git a/src/Utilities/General/stratified_samples.cc b/src/Utilities/General/stratified_samples.cc index 10b827b1..db6708e9 100644 --- a/src/Utilities/General/stratified_samples.cc +++ b/src/Utilities/General/stratified_samples.cc @@ -643,7 +643,7 @@ do_split(resizable_array_p<ID_Stratum_Selected>& idss, int ndx, fname << stem_for_training_set << ndx << ".smi"; - if (!write_smiles(idss, fname, std::bind2nd(std::greater<int>(), 0))) { + if (!write_smiles(idss, fname, [](const int s) { return s > 0;})) { return 0; } @@ -652,7 +652,7 @@ do_split(resizable_array_p<ID_Stratum_Selected>& idss, int ndx, fname << stem_for_test_set << ndx << ".smi"; - if (!write_smiles(idss, fname, std::bind2nd(std::equal_to<int>(), 0))) { + if (!write_smiles(idss, fname, [](const int s) { return s == 0;})) { return 0; } } diff --git a/src/Utilities/Makefile b/src/Utilities/Makefile deleted file mode 100644 index 392edcbe..00000000 --- a/src/Utilities/Makefile +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright 2018 Eli Lilly and Company -# -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -######################################################################## - -IWPROGRAMMES ?= $(PWD)/../.. -UNAME ?= Linux-gcc-6.2.0 - -prefix = $(IWPROGRAMMES) -exec_prefix = $(prefix) - -libdir = ${exec_prefix}/lib/$(UNAME) -includedir = ${prefix}/include -bindir = ${exec_prefix}/bin/$(UNAME) - -CP=cp -p - -SUBDIRS := $(wildcard */.) - -.PHONY : $(SUBDIRS) -.PHONY : $(DO_X) -.PHONY: copy_include -.PHONY: library -.PHONY: copy_library -.PHONY: exe -.PHONY: copy_exe -.PHONY: clean -.PHONY: veryclean - - -DO_X = do-clean\ - do-veryclean\ - do-copy_include\ - do-library\ - do-copy_library\ - do-exe\ - do-copy_exe - -# Enter each directory to build -# Build to Build directory -$(DO_X): - @target=`echo $@ | sed -e 's/^do-//'`; \ - for dir in $(SUBDIRS) ; do \ - cd $${dir};\ - if [ -f ./Makefile ]; \ - then \ - if [ "$${target}" != "veryclean" ] ; \ - then \ - if [ ! -d ./$(UNAME) ] ; \ - then \ - mkdir ./$(UNAME) ; \ - fi ; \ - fi; \ - IWPROGRAMMES=$(IWPROGRAMMES) UNAME=$(UNAME) BUILD_DIR=$(UNAME) CXX=$(CXX) $(MAKE) -f Makefile $${target} ; \ - if [ "$${target}" = "veryclean" ] ; \ - then \ - if [ -d ./$(UNAME) ] ; \ - then \ - echo "Removing $(UNAME)" ; \ - rm -r ./$(UNAME) ; \ - fi ; \ - fi; \ - fi; \ - cd ..;\ - done; - -include: includedir copy_include_files - -includedir: - echo "Making ${includedir}" - if [ ! -d ${includedir} ] ; then mkdir ${includedir} ; fi - cp -p include/* $(includedir) - -libdir: $(libdir) - -bindir: $(bindir) - -copy_include: do-copy_include - -veryclean: do-veryclean - -clean: do-clean - -exe: do-exe - -copy_exe: do-copy_exe - -library: do-library - -copy_library: do-copy_library - diff --git a/src/Vendor/AAReadme.md b/src/Vendor/AAReadme.md new file mode 100644 index 00000000..04e7755d --- /dev/null +++ b/src/Vendor/AAReadme.md @@ -0,0 +1,10 @@ +# Licensed Software + +This directory contains LillyMol interfaces to some +licensed software. + +If you have a license, adjust WORKSPACE to point to your +installation, and then you should be able to do +``` +bazelisk build -c opt <other bazel options> Vendor:all +``` diff --git a/src/WORKSPACE b/src/WORKSPACE index 43ec3b76..72f0d5a9 100644 --- a/src/WORKSPACE +++ b/src/WORKSPACE @@ -99,7 +99,7 @@ new_local_repository( build_file_content = """ cc_library ( name = "pybind11", - hdrs = glob( + hdrs = glob( ["pybind11/**/*.h"], ), deps = [ @@ -161,7 +161,7 @@ new_local_repository( cc_library ( name = "biobyte", srcs = [ "lib/libBB.a", "lib/libf2c.a" ], - hdrs = glob(["h/*.h"]), + hdrs = glob(["h/*.h"]), strip_include_prefix = "h", visibility = ["//visibility:public"], ) diff --git a/src/build_from_src.sh b/src/build_from_src.sh index 9d958ded..3bd0b6f9 100755 --- a/src/build_from_src.sh +++ b/src/build_from_src.sh @@ -4,54 +4,102 @@ echo "Builds and installs LillyMol executables" echo "The assumption is that WORKSPACE and build_deps/install.bzl" echo "have both been configured." echo "" -echo "First task is to run C++ unit tests." - +echo "First task is to build and run C++ unit tests." # note that we do not check return codes from any of the invocations. -set -x +# If bazelisk is available use it, otherwise try bazel, otherwise fail. + +if [[ ! -z "$(type -p bazelisk)" ]] ; then + bazel='bazelisk' +elif [[ ! -z "$(type -p bazel)" ]] ; then + bazel='bazel' +else + echo "No bazel or bazelisk, build will fail" + bazel='bazelisk' +fi +# Adjust to local resource availability. jobs='8' # Options that are used by all bazelisk invocations. + # bazel will not work on an NFS mounted file system. So if you are on an NFS # file system, you must specify a value for --output_user_root that is # locally mounted. -# If your local file system is suitable for the bazel cache. -bazel_options="" -# If inside Lilly, some local scratch storage -# bazel_options="--output_user_root=/node/scratch/ian" +# Note that the bazel cache can get quite large, 1-2GB. -build_options="--cxxopt=-DGIT_HASH=\"$(git rev-parse --short --verify HEAD)\" --cxxopt=-DTODAY=\"$(date +%Y-%b-%d)\" --jobs=${jobs} -c opt --enable_bzlmod --experimental_cc_shared_library" - -echo ${common_options} +# If inside Lilly, some local scratch storage +if [[ $(hostname -d) =~ 'lilly.com' && -d '/node/scratch' ]] ; then + bazel_options="--output_user_root=/node/scratch/${USER}" +elif [[ $(df -TP ${HOME}) =~ 'nfs' ]] ; then + echo "Your HOME dir is an NFS mounted file system. bazel will not work." + echo "Will attempt to use /tmp/ for bazel cache, that will need to be changed." + bazel_options='--output_user_root=/tmp' +else + # Even if outside Lilly, you may still need to set this + bazel_options="" +fi + +build_options="--cxxopt=-DGIT_HASH=\"$(git rev-parse --short --verify HEAD)\" --cxxopt=-DTODAY=\"$(date +%Y-%b-%d)\" --jobs=${jobs} -c opt" + +# All BerkeleyDB things are now isolated, so this probably makes no difference. +if [[ ! -v BUILD_BDB ]] ; then + build_options+=' --build_tag_filters=-berkeleydb' +fi # First task is unit tests +set -x + +${bazel} ${bazel_options} test ${build_options} Foundational/...:all +${bazel} ${bazel_options} test ${build_options} Molecule_Lib:all +${bazel} ${bazel_options} test ${build_options} Molecule_Tools:all +${bazel} ${bazel_options} test ${build_options} Utilities/...:all -bazelisk ${bazel_options} test ${build_options} Foundational/...:all -bazelisk ${bazel_options} test ${build_options} Molecule_Lib:all -bazelisk ${bazel_options} test ${build_options} Molecule_Tools:all -bazelisk ${bazel_options} test ${build_options} Utilities/...:all +# Currently no tests in these. +if [[ -v BUILD_BDB ]] ; then + # ${bazel} ${bazel_options} test ${build_options} BerkeleyDB:all + # ${bazel} ${bazel_options} test ${build_options} Molecule_Tools_Bdb:all + echo "" +fi -# Once the tests pass, then executables can be built +# Once the tests run, then executables can be built. +# donor_acceptor_test frequently fails due to lack of supporting files. echo "Building tools" -bazelisk ${bazel_options} build ${build_options} Molecule_Tools:all -bazelisk ${bazel_options} build ${build_options} Foundational/iw_tdt:all -bazelisk ${bazel_options} build ${build_options} Utilities/...:all +${bazel} ${bazel_options} build ${build_options} Molecule_Tools:all +${bazel} ${bazel_options} build ${build_options} Foundational/iw_tdt:all +${bazel} ${bazel_options} build ${build_options} Utilities/...:all -bazelisk ${bazel_options} build ${build_options} pybind:all +if [[ -v BUILD_BDB ]] ; then + ${bazel} ${bazel_options} build ${build_options} BerkeleyDB:all + ${bazel} ${bazel_options} build ${build_options} Molecule_Tools_Bdb:all +fi # Now install the targets echo "Installing tools" -bazelisk ${bazel_options} run ${build_options} Foundational/iw_tdt:install -bazelisk ${bazel_options} run ${build_options} Molecule_Tools:install -bazelisk ${bazel_options} run ${build_options} Utilities/General:install -bazelisk ${bazel_options} run ${build_options} Utilities/GFP_Tools:install -bazelisk ${bazel_options} run ${build_options} Utilities/Distance_Matrix:install -bazelisk ${bazel_options} run ${build_options} Utilities/BerkeleyDB:install - -# The python shared libraries. Note that PYTHONPATH will need to be adjusted, -# or copy these to your default PYTHONPATH. -./copy_shared_libraries.sh ../lib64 +${bazel} ${bazel_options} run ${build_options} Foundational/iw_tdt:install +${bazel} ${bazel_options} run ${build_options} Molecule_Tools:install +${bazel} ${bazel_options} run ${build_options} Utilities/General:install +${bazel} ${bazel_options} run ${build_options} Utilities/GFP_Tools:install +${bazel} ${bazel_options} run ${build_options} Utilities/Distance_Matrix:install +if [[ -v BUILD_BDB ]] ; then + ${bazel} ${bazel_options} run ${build_options} BerkeleyDB:install + ${bazel} ${bazel_options} run ${build_options} Molecule_Tools_Bdb:install +fi + +# Python if requested, build, install and test. +# Note that PYTHONPATH will need to be adjusted, or copy the shared +# libraries from LillyMol/lib to your default PYTHONPATH. + +if [[ -v BUILD_PYTHON ]] ; then + ${bazel} ${bazel_options} build ${build_options} pybind:all + ./copy_shared_libraries.sh ../lib + + if [[ -s "../lib/lillymol.so" ]] ; then + ./run_python_unit_tests.sh + else + echo "Python shared libraries not found" + fi +fi diff --git a/src/build_third_party.sh b/src/build_third_party.sh index f9223565..cb1e3f94 100755 --- a/src/build_third_party.sh +++ b/src/build_third_party.sh @@ -78,24 +78,25 @@ must_build=0 # (cd googletest && cd build && make install) # fi -# Needed if building with cmake, and protoc is not installed if [[ ! -d ${third_party}/bin ]] ; then - mkdir -p ${third_party}/bin + mkdir -p ${third_party}/bin fi -must_build=0 -if [[ ! -d 'protobuf' ]] ; then - git clone https://github.com/protocolbuffers/protobuf - must_build=1 -fi -if [[ ${must_build} -eq 1 || ! -d "${third_party}/include/google/protobuf" ]] ; then - (cd protobuf && git pull) - (cd protobuf && git submodule update --init --recursive) - # if bazel is used, the libraries don't get generated, not sure why... - (cd protobuf && cmake . -DCMAKE_CXX_STANDARD=14) - (cd protobuf && cmake --build .) +# Needed if building with cmake, and protoc is not installed -fi +# must_build=0 +# if [[ ! -d 'protobuf' ]] ; then +# git clone https://github.com/protocolbuffers/protobuf +# must_build=1 +# fi +# if [[ ${must_build} -eq 1 || ! -d "${third_party}/include/google/protobuf" ]] ; then +# (cd protobuf && git pull) +# (cd protobuf && git submodule update --init --recursive) +# # if bazel is used, the libraries don't get generated, not sure why... +# (cd protobuf && cmake . -DCMAKE_CXX_STANDARD=14) +# (cd protobuf && cmake --build .) +# +# fi # oneTBB now available via MODULE # must_build=0 @@ -120,6 +121,7 @@ must_build=0 if [[ ! -d 'highwayhash' ]] ; then git clone https://github.com/google/highwayhash must_build=1 + (cd highwayhash && git config pull.rebase false) fi if [[ ${must_build} -eq 1 || ! -s '${third_party}/highwayhash/lib/libhighwayhash.a' ]] ; then (cd highwayhash && git pull) @@ -149,93 +151,83 @@ if [[ ${must_build} -eq 1 || ! -s 'libf2c/libf2c.a' ]] ; then fi # You should examine the BerkeleyDB license terms, it is not necessarily free. -must_build=0 -bdb_version='18.1.40' -if [[ ! -s "db-${bdb_version}.tar.gz" ]] ; then - wget http://download.oracle.com/berkeley-db/db-${bdb_version}.tar.gz - tar zxvf db-${bdb_version}.tar.gz - must_build=1 -fi -if [[ ${must_build} -eq 1 || ! -s "${third_party}/BDB/include/db.h" ]] ; then - (cd "db-${bdb_version}/build_unix" && make realclean) - (cd "db-${bdb_version}/build_unix" && ../dist/configure --prefix=${third_party}/BDB --enable-cxx --enable-shared=no --with-repmgr-ssl=no) - (cd "db-${bdb_version}/build_unix" && make) - # fails on some items not installed, but installs what we need. - (cd "db-${bdb_version}/build_unix" && make install) +if [[ -v BUILD_BDB ]] ; then + must_build=0 + bdb_version='18.1.40' + if [[ ! -s "db-${bdb_version}.tar.gz" ]] ; then + wget http://download.oracle.com/berkeley-db/db-${bdb_version}.tar.gz + tar zxf db-${bdb_version}.tar.gz + must_build=1 + fi + if [[ ${must_build} -eq 1 || ! -s "${third_party}/BDB/include/db.h" ]] ; then + (cd "db-${bdb_version}/build_unix" && make realclean) + (cd "db-${bdb_version}/build_unix" && ../dist/configure --prefix=${third_party}/BDB --enable-cxx --enable-shared=no --with-repmgr-ssl=no) + (cd "db-${bdb_version}/build_unix" && make) + # fails on some items not installed, but installs what we need. + (cd "db-${bdb_version}/build_unix" && make -j 4 install) + + echo "" + echo "Ignore error messages from BerkeleyDB install, it is for components we do not use" + fi fi # cilk?? # Not yet in the public release. -if [[ ! -d "x86-simd-sort" ]] ; then - git clone 'https://github.com/intel/x86-simd-sort' -fi -# Figure out of WORKSPACE is where we can find it. -if [[ -s 'WORKSPACE' ]] ; then - workspace='WORKSPACE' -elif [[ -s 'src/WORKSPACE' ]] ; then - workspace='src/WORKSPACE' -else - echo "No WORKSPACE file found" >&2 - exit 1 -fi +# if [[ ! -d "x86-simd-sort" ]] ; then +# git clone 'https://github.com/intel/x86-simd-sort' +# fi # Fastfloat get prebuilt single header # Oct 2022. Not implemented because it seems # that the existing conversion functions are faster. # That seems impossible. TODO:ianwatson investigate. -set -x -if [[ ! -d "${third_party}/include" ]] ; then - mkdir -p "${third_party}/include" -fi -if [[ ! -s "${third_party}/include/fast_float.h" ]] ; then - (cd ${third_party}/include && wget https://github.com/fastfloat/fast_float/releases/download/v3.4.0/fast_float.h) -fi - -# If you do not want to install MPI dependent tools, omit this AND comment out the mpich -# section in WORKSPACE. Run the build with --build-tag_filters=-mpi which suppresses -# building of tools that depend on MPI. - -# Indeed this takes too long to build, and then fails because it needs some -# further system dependencies (Ubuntu 22). The best way to use mpi might be to install it on -# the system if you can. Only one tool depends on it. - -# must_build=0 -# mpi_version='4.1.2' -# if [[ ! -d ${third_party}/mpich-${mpi_version}/ ]] ; then -# (cd ${third_party} && wget https://www.mpich.org/static/downloads/4.1.2/mpich-${mpi_version}.tar.gz) -# (cd ${third_party} && tar zxvf mpich-${mpi_version}.tar.gz) -# must_build=1 -# fi - -# if [[ $must_build -eq 1 || ! -s ${third_party}/mpich/src/lib ]] ; then - (cd ${third_party}/mpich-${mpi_version}/ && ./configure --prefix=${third_party}) -# (cd ${third_party}/mpich-${mpi_version}/ && make) +# if [[ ! -d "${third_party}/include" ]] ; then +# mkdir -p "${third_party}/include" # fi +# (cd ${third_party}/include && wget https://github.com/fastfloat/fast_float/releases/download/v3.4.0/fast_float.h) -# Make an attempt to generate an updated WORKSPACE file. -# First return to our starting point, which hopefully has WORKSPACE +# Make an attempt to generate an updated WORKSPACE file for python. cd ${maybe_src} -echo "Back to ${PWD}" +# Figure out if WORKSPACE is where we can find it. +if [[ -s 'WORKSPACE' ]] ; then + workspace='WORKSPACE' +elif [[ -s 'src/WORKSPACE' ]] ; then + workspace='src/WORKSPACE' +else + echo "No WORKSPACE file found" >&2 + exit 1 +fi -# OMG there seems to be a bug in sed, and this does not work! -# If I change the third_party to third_partq it works. Amazing. -# This remains broken until sed works properly. Version 4.8.1 does -# not work, nor does 4.1.5. -# Seems hard to imagine that sed has a bug like this, maybe I am mistaken??!! - -# Quote and backslash hell... -third_party=$(echo ${third_party} | sed -e 's/\//\\\//g') -echo "third_party ${third_party}" -tmpworkspace='/tmp/WORKSPACE' -sed --regexp-extended -e "s/path = \"..*\/(..+)\"/path = \"${third_party}\/\\1\"/" ${workspace} > ${tmpworkspace} -echo "Please check ${tmpworkspace} for a possibly ready to use WORKSPACE file" >&2 +# Only build python if requested +if [[ -v BUILD_PYTHON ]] ; then + # Use python to update WORKSPACE for python locations. + if [[ -s 'update_python_in_workspace.py' ]] ; then + cp ${workspace} /tmp + python3 ./update_python_in_workspace.py /tmp/WORKSPACE > ${workspace} + if [[ ! -s ${workspace} ]] ; then + echo "Updating WORKSPACE failed, restoring orignal, python bindings will not work" + cp -f /tmp/WORKSPACE ${workspace} + fi + else + echo "Missing update_python_in_workspace.py, WORKSPACE not updated for python" + fi +fi +# install.bzl does need to be updated. +echo 'Updating build_deps/install.bzl' if [[ -s 'build_deps/install.bzl' ]] ; then tmpinstall='/tmp/install.bzl' - bindir=$(echo ${PWD}/bin/Linux | sed -e 's/\//\\\//g') - sed -e "s/default = \"..+\"/default =\"${bindir}\"/" build_deps/install.bzl > ${tmpinstall} - echo "Please check ${tmpinstall} for a possibly ready to use build_deps/install.bzl file" >&2 + bindir=$(echo ${PWD}/../bin/$(uname) | sed -e 's/\//\\\//g') + # Make a copy + cp build_deps/install.bzl /tmp/install.bzl.orig + sed --in-place --regexp-extended -e "s/default = *\"..+\",/default =\"${bindir}\",/" build_deps/install.bzl > ${tmpinstall} + + # Create bindir if not already present + bindir=$(echo ${PWD}/../bin/$(uname)) + if [[ ! -d ${bindir} ]] ; then + mkdir -p ${bindir} + fi fi diff --git a/src/copy_shared_libraries.sh b/src/copy_shared_libraries.sh index e05446c5..479789b8 100755 --- a/src/copy_shared_libraries.sh +++ b/src/copy_shared_libraries.sh @@ -2,13 +2,10 @@ # when building a pybind environment, we need to copy the shared libraries generated # by bazel to somewhere permanent. -# Ideally we could install the pre-requisites separately and link against them, -# but in practice this proved too hard. Minor version inconsistencies introduced -# compatibility problems. Using the shared libraries generated by bazel ensures -# that things are compatible. +# we also copy _pb2.py files if [[ -z $1 ]] ; then - destdir='/lrlhps/users/rx87690/LillyMolPrivate/lib64' + destdir='/lrlhps/users/rx87690/LillyMolPrivate/lib' else destdir=$1 fi @@ -36,3 +33,19 @@ for lib in "${libs[@]}" ; do echo "${lib} not found" fi done + +# Copy python generated protos + +declare -a pb2=( + atom_type_ext_pb2.py + geometric_constraints_pb2.py + mol2graph_pb2.py + substructure_pb2.py + reaction_pb2.py + toggle_kekule_form_pb2.py +) + +for proto_pb2 in "${pb2[@]}" ; do + echo "Copying ${proto_pb2}" + cp -f bazel-bin/Molecule_Lib/${proto_pb2} Molecule_Lib +done diff --git a/src/pybind/BUILD b/src/pybind/BUILD index 3b7a070b..17062a3a 100644 --- a/src/pybind/BUILD +++ b/src/pybind/BUILD @@ -268,6 +268,31 @@ cc_shared_library( shared_lib_name = "lillymol_tsubstructure.so", ) +cc_library( + name = "lillymol_tools", + srcs = [ + "lillymol_pybind_tools.cc", + ], + hdrs = [ + ], + deps = [ + "//Molecule_Lib:iwmolecule", + "//Molecule_Lib:iwreaction", + "//Molecule_Lib:moleculeio", + "//Molecule_Tools:unique_molecules_api", + "@pybind11", + "@python", + ], +) + +cc_shared_library( + name = "lillymol_tools_shared", + deps = [ + ":lillymol_tools", + ], + shared_lib_name = "lillymol_tools.so", +) + # Cannot figure out how to make this work. TODO:ianwatson #py_pytest_test( # name = "test_lillymol", diff --git a/src/pybind/lillymol_io_test.py b/src/pybind/lillymol_io_test.py index f3e4c1ee..91a54d4d 100644 --- a/src/pybind/lillymol_io_test.py +++ b/src/pybind/lillymol_io_test.py @@ -135,6 +135,7 @@ def test_connection_table_errors(self): with open(fname, "w") as writer: writer.write('\n'.join(f) + '\n') + set_display_smiles_interpretation_error_messages(0) molecules_read = 0 with ReaderContext(fname, FileType.SMI) as reader: for mol in reader: @@ -149,6 +150,7 @@ def test_ignore_connection_table_errors(self): with open(fname, "w") as writer: writer.write('\n'.join(f) + '\n') + set_display_smiles_interpretation_error_messages(0) molecules_read = 0 with ReaderContext(fname, FileType.SMI) as reader: reader.set_ignore_connection_table_errors(1) diff --git a/src/pybind/lillymol_pybind.cc b/src/pybind/lillymol_pybind.cc index 0cc18382..831d227d 100644 --- a/src/pybind/lillymol_pybind.cc +++ b/src/pybind/lillymol_pybind.cc @@ -342,6 +342,14 @@ PYBIND11_MODULE(lillymol, m) .def("largest_ring_size", static_cast<int (Molecule::*)()>(&Molecule::LargestRingSize), "Largest ring size") .def("number_ring_systems", static_cast<int (Molecule::*)()>(&Molecule::number_ring_systems), "Number ring systems") .def("is_spiro_fused", static_cast<int (Molecule::*)(atom_number_t)>(&Molecule::is_spiro_fused), "True if atom is spiro fused") + .def("label_atoms_by_atom_number", [](Molecule& m) { + const int matoms = m.natoms(); + for (int i = 1; i < matoms; ++i) { + m.set_isotope(i, i); + } + }, + "Isotope becomes atom number" + ) .def("label_atoms_by_ring_system", [](Molecule& m)->std::vector<int>{ std::vector<int> rc(m.natoms()); @@ -932,6 +940,27 @@ PYBIND11_MODULE(lillymol, m) .def("valence_ok", &Atom::valence_ok, "True if valence is ok") .def("fully_saturated", &Atom::fully_saturated, "True if fully saturated") .def("other", static_cast<atom_number_t (Atom::*)(atom_number_t, int)const>(&Atom::other), "Other connection") + .def("x", [](const Atom* a)->float { + return a->x(); + }, + "x coordinate" + ) + .def("y", [](const Atom* a)->float { + return a->y(); + }, + "y coordinate" + ) + .def("z", [](const Atom* a)->float { + return a->z(); + }, + "z coordinate" + ) + .def("distance", [](const Atom* a1, const Atom* a2)->float { + return a1->distance(*a2); + }, + "spatial distance between atoms" + ) + .def("__repr__", [](Atom &a) { IWString s; diff --git a/src/pybind/lillymol_pybind_query.cc b/src/pybind/lillymol_pybind_query.cc index c104e6c8..7f108b63 100644 --- a/src/pybind/lillymol_pybind_query.cc +++ b/src/pybind/lillymol_pybind_query.cc @@ -4,6 +4,7 @@ #include "pybind11/pybind11.h" #include "pybind11/stl.h" +#include "Molecule_Lib/molecule_to_query.h" #include "Molecule_Lib/substructure.h" #include "Molecule_Lib/substructure.pb.h" @@ -42,6 +43,13 @@ PYBIND11_MODULE(lillymol_query, q) .def(py::init<>()) .def("build_from_smarts", static_cast<int (Substructure_Query::*)(const std::string&)>(&Substructure_Query::CreateFromSmarts), "build from smarts") + .def("build_from_molecule", [](Substructure_Query& q, Molecule& m)->bool { + Molecule_to_Query_Specifications mqs; + mqs.set_make_embedding(1); + return q.create_from_molecule(m, mqs); + }, + "Convert `m` to a query with default conditions" + ) .def("set_only_keep_matches_in_largest_fragment", &Substructure_Query::set_only_keep_matches_in_largest_fragment, "set_only_keep_matches_in_largest_fragment") .def("set_embeddings_do_not_overlap", &Substructure_Query::set_embeddings_do_not_overlap, "set_embeddings_do_not_overlap") .def("set_find_one_embedding_per_atom", &Substructure_Query::set_find_one_embedding_per_atom, "set_find_one_embedding_per_atom") @@ -81,20 +89,27 @@ PYBIND11_MODULE(lillymol_query, q) rc << "<SubstructureQuery " << q.comment() << '>'; return std::string(rc.data(), rc.length()); }) - .def("read_proto", + .def("read_proto", [](Substructure_Query& qry, const std::string& fname)->bool{ IWString tmp(fname.data(), fname.size()); return qry.ReadProto(tmp); }, "read from textproto file" ) - // Maybe one day when we get move constructures for a query - /*.def("QueryFromSmarts", + .def("read_msi", + [](Substructure_Query& qry, const std::string& fname)->bool { + const IWString myfname(fname); + return qry.read(myfname); + }, + "read MSI style query from 'fname'" + ) + // Maybe one day when we get move constructures for a query + /*.def("QueryFromSmarts", [](const std::string& smarts){ return QueryFromSmarts(smarts); }, "Query created from smarts - or None" - )*/ - ; + )*/ + ; } diff --git a/src/pybind/lillymol_pybind_tools.cc b/src/pybind/lillymol_pybind_tools.cc index 682b35c2..991f800e 100644 --- a/src/pybind/lillymol_pybind_tools.cc +++ b/src/pybind/lillymol_pybind_tools.cc @@ -12,6 +12,11 @@ PYBIND11_MODULE(lillymol_tools, m) { using unique_molecules::UniqueMolecules; + // This is a sub-optimal implementation. While functional, it is not efficient. + // Much to my surprise I found that storing smiles in a python set() was much + // faster than storing those same strings in the C++ map used in the current + // implementation. TODO:ianwatson understand what is going on. + // For now this is quite usable, just not efficient. py::class_<unique_molecules::UniqueMolecules>(m, "UniqueMolecules") .def(py::init<>()) .def("set_exclude_chiral_info", &UniqueMolecules::set_exclude_chiral_info, "Ignore chirality") @@ -26,6 +31,8 @@ PYBIND11_MODULE(lillymol_tools, m) py::return_value_policy::reference, "Element transformations" ) + // Element Transformations temporarily not working - need to figure out duplicate Element ptr issue +#ifdef ADD_ELEMENT_TRANSFORMATION_NOT_YET_WORKING .def("add_element_transformation", [](UniqueMolecules& u, const std::string& trans)->bool{ const IWString s(trans); @@ -33,6 +40,7 @@ PYBIND11_MODULE(lillymol_tools, m) }, "Add one element transformation" ) +#endif .def("graph_specifications", [](UniqueMolecules& u)->Mol2Graph&{ return u.graph_specifications(); diff --git a/src/pybind/lillymol_unique_molecules_test.py b/src/pybind/lillymol_unique_molecules_test.py new file mode 100644 index 00000000..b21fe5cc --- /dev/null +++ b/src/pybind/lillymol_unique_molecules_test.py @@ -0,0 +1,95 @@ +# Tests for unique_molecules + +from absl import app +from absl import logging +from absl.testing import absltest + +from lillymol import * +from lillymol_tools import UniqueMolecules + +class TestUniqueMolecules(absltest.TestCase): + def test_methane(self): + smiles = "C" + mols = [MolFromSmiles(smi) for smi in smiles * 10] + u = UniqueMolecules() + self.assertTrue(u.is_unique(mols.pop())) + for mol in mols: + self.assertFalse(u.is_unique(mol)) + + def test_chiral_different(self): + m1 = MolFromSmiles("C(O)[C@@H](N)C") + m2 = MolFromSmiles("C(O)[C@H](N)C") + + u = UniqueMolecules() + self.assertTrue(u.is_unique(m1)) + self.assertTrue(u.is_unique(m2)) + + def test_chiral_same(self): + m1 = MolFromSmiles("C(O)[C@@H](N)C") + m2 = MolFromSmiles("C(O)[C@H](N)C") + + u = UniqueMolecules() + u.set_exclude_chiral_info(True) + self.assertTrue(u.is_unique(m1)) + self.assertFalse(u.is_unique(m2)) + + def test_fragments_different(self): + m1 = MolFromSmiles("CC.C") + m2 = MolFromSmiles("CC.O") + + u = UniqueMolecules() + self.assertTrue(u.is_unique(m1)) + self.assertTrue(u.is_unique(m2)) + + def test_fragments_same(self): + m1 = MolFromSmiles("CC.C") + m2 = MolFromSmiles("CC.O") + + u = UniqueMolecules() + u.set_strip_to_largest_fragment(True) + self.assertTrue(u.is_unique(m1)) + self.assertFalse(u.is_unique(m2)) + + def test_etrans_not_in_effect(self): + m1 = MolFromSmiles("Ic1cc(Cl)c(Br)c(F)c1") + m2 = MolFromSmiles("Clc1cc(I)c(Br)c(F)c1") + + u = UniqueMolecules() + self.assertTrue(u.is_unique(m1)) + self.assertTrue(u.is_unique(m2)) + + def test_etrans_applied(self): + return None + # Temporarily disabled till we figure out the Element ptr issue. + m1 = MolFromSmiles("Ic1cc(Cl)c(Br)c(F)c1") + m2 = MolFromSmiles("Clc1cc(I)c(Br)c(F)c1") + + u = UniqueMolecules() + u.add_element_transformation("I=Cl") + u.add_element_transformation("Br=Cl") + + self.assertTrue(u.is_unique(m1)) + self.assertFalse(u.is_unique(m2)) + + def test_isotopes_differentiated(self): + m1 = MolFromSmiles("C") + + u = UniqueMolecules() + self.assertTrue(u.is_unique(m1)) + self.assertFalse(u.is_unique(m1)) + + m1.set_isotope(0, 1); + self.assertTrue(u.is_unique(m1)) + + def test_isotopes_same(self): + m1 = MolFromSmiles("C") + + u = UniqueMolecules() + u.set_ignore_isotopes(True); + self.assertTrue(u.is_unique(m1)) + + m1.set_isotope(0, 1) + self.assertFalse(u.is_unique(m1)) + +if __name__ == '__main__': + absltest.main() diff --git a/src/run_python.sh b/src/run_python.sh new file mode 100755 index 00000000..6ecea701 --- /dev/null +++ b/src/run_python.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Run python with PYTHONPATH pointing to the shared libraries generated +# by build_from_src.sh +# Make sure that PATH is set so that the same version of python that +# is in WORKSPACE is used for run-time. +# This will not work otherwise. + +# build_from_src.sh must have been run, and one of the last things it +# does is to run copy_shared_libraries.sh, which copies the compiled +# shared libraries out of bazel-bin to ../lib + +# Assume that lib, with the shared libraries, is one above where this script is. +my_dir=$(dirname $0) +PYTHONPATH=${my_dir}/../lib:${my_dir}:${PYTHONPATH} python3 "$@" diff --git a/src/run_python_unit_tests.sh b/src/run_python_unit_tests.sh new file mode 100755 index 00000000..fadcdd68 --- /dev/null +++ b/src/run_python_unit_tests.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Run all the python unit tests found in the pybind directory. + +here=$(dirname $0) + +if [[ ! -s "${here}/../lib" ]] ; then + echo "No shared libraries available ${here}, python unit tests not done" + exit 1 +fi + +if [[ ! -d "${here}/pybind" ]] ; then + echo "pybind not found ${here}" + exit 1 +fi + +for file in ${here}/pybind/*_test.py ; do + ${here}/run_python.sh ${file} +done + +echo 'Python unit tests complete' diff --git a/src/update_python_in_workspace.py b/src/update_python_in_workspace.py new file mode 100644 index 00000000..c316b041 --- /dev/null +++ b/src/update_python_in_workspace.py @@ -0,0 +1,77 @@ +# Used during Docker builds to update WORKSPACE to +# reflect the python installation in the Docker file +# Basically just finds the relevant 'path = ' sections +# in WORKSPACE and updates them +# We assume that the caller has copied the original to a +# safe location, this script writes to stdout. +# cp WORKSPACE /tmp +# update_python_in_workspace /tmp/WORKSPACE > WORKSPACE + +import os +import re +import sysconfig + +from absl import app +from absl import logging + +have_pybind = True +try: + from pybind11 import * +except: + logging.info("No pybind11 build will fail") + have_pybind = False + +# Scan a WORKSPACE file and change the 'path = ' directive +# for new_local_repository's 'pybind11' and 'python'. +# We assume that WORKSPACE contains 'name = ' BEFORE 'path ='. + +def update_python_in_workspace(argv): + # The location of python and pybind11 includes + python_install = sysconfig.get_path('include') + logging.info("Python in %s", python_install) + + pybind_install = "" + if have_pybind: + pybind_install = get_include() + logging.info("pybind11 in %s", pybind_install) + + in_new_local_repository = False + # The name of the new_local_repository we are in + name = "" + + with open(argv[1], "r") as reader: + for line in reader: + line = line.rstrip() + if line.startswith("new_local_repository"): + in_new_local_repository = True + print(line) + continue + + if line.startswith(")"): + if in_new_local_repository: + name = "" + in_new_local_repository = False + print(line) + continue + + m = re.search(r'name *= *"(\S+)"', line) + if m: + name = m[1] + print(line) + continue + + m = re.search(r'path *= *"(\S+)"', line) + if m: + if not in_new_local_repository: + print(line) + elif name == "python": + print(' path = "' + python_install + '",') + elif name == "pybind11" and len(pybind_install) > 0: + print(' path = "' + pybind_install + '",') + else: + print(line) + else: + print(line) + +if __name__ == "__main__": + app.run(update_python_in_workspace) diff --git a/test/abraham/case_1/run_case.sh b/test/abraham/case_1/run_case.sh index 19ed6a59..865be362 100755 --- a/test/abraham/case_1/run_case.sh +++ b/test/abraham/case_1/run_case.sh @@ -13,7 +13,7 @@ else BIN_DIR=$LILLYMOL_HOME/bin/$BUILD_DIR fi -QUERY_DIR=$LILLYMOL_HOME/contrib/data/queries +QUERY_DIR=$LILLYMOL_HOME/data/queries command=$BIN_DIR/abraham case_id="Case 1" echo "Testing: $command" diff --git a/test/dbf/case_1/run_case.sh b/test/dbf/case_1/run_case.sh index e3c106d1..3267c5d8 100755 --- a/test/dbf/case_1/run_case.sh +++ b/test/dbf/case_1/run_case.sh @@ -32,7 +32,7 @@ cmp_out="$test_cmd_top/$case/out/test.out" echo "Testing: $command" -queries_dir="$LILLYMOL_HOME/contrib/data/queries" +queries_dir="$LILLYMOL_HOME/data/queries" $command \ -N F:${queries_dir}/charges/queries \ diff --git a/test/getMMPStatsfromCSV/case_5/run_case.sh b/test/getMMPStatsfromCSV/case_5/run_case.sh index c8db7acc..382c00f2 100755 --- a/test/getMMPStatsfromCSV/case_5/run_case.sh +++ b/test/getMMPStatsfromCSV/case_5/run_case.sh @@ -35,7 +35,7 @@ echo "Testing: $command" $command -i "$in" -o "$out" -s SMILES -n CHEMBL_ID -a hERG_pIC50 -A DIFF60 2>>err.txt -$diff_tool ${$gold_out} ${out}.sum +$diff_tool ${gold_out} ${out}.sum ret=$? if [ $ret -eq 1 ] diff --git a/test/getMMPfromSMI/case_2/test_data_01.log b/test/getMMPfromSMI/case_2/test_data_01.log deleted file mode 100644 index 8c0589f7..00000000 --- a/test/getMMPfromSMI/case_2/test_data_01.log +++ /dev/null @@ -1,306 +0,0 @@ -06/08/2023 09:51:38 PM INFO getMMPfromSMI: Instantiating MMP Objects -06/08/2023 09:51:38 PM INFO mmp_objects: Beginning pre-scan of input smiles file -06/08/2023 09:51:38 PM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/08/2023 09:51:38 PM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/08/2023 09:51:38 PM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/apps/gc3tk/c3tk-core/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/08/2023 09:51:38 PM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/08/2023 09:51:38 PM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/08/2023 09:51:38 PM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/08/2023 09:51:38 PM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/08/2023 09:51:38 PM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/08/2023 09:51:38 PM INFO getMMPfromSMI: Write out final pairs -06/08/2023 09:51:38 PM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/08/2023 09:51:38 PM INFO mmp_objects: Iterating over single cut pairs dictionary -06/08/2023 09:51:38 PM INFO mmp_objects: Iterating over double cut pairs dictionary -06/08/2023 09:51:38 PM INFO mmp_objects: All done! -06/08/2023 09:51:38 PM INFO getMMPfromSMI: Complete. -06/08/2023 09:57:47 PM INFO getMMPfromSMI: Instantiating MMP Objects -06/08/2023 09:57:47 PM INFO mmp_objects: Beginning pre-scan of input smiles file -06/08/2023 09:57:47 PM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/08/2023 09:57:47 PM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/08/2023 09:57:47 PM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/apps/gc3tk/c3tk-core/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/08/2023 09:57:47 PM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/08/2023 09:57:47 PM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/08/2023 09:57:47 PM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/08/2023 09:57:47 PM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/08/2023 09:57:47 PM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/08/2023 09:57:47 PM INFO getMMPfromSMI: Write out final pairs -06/08/2023 09:57:47 PM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/08/2023 09:57:47 PM INFO mmp_objects: Iterating over single cut pairs dictionary -06/08/2023 09:57:47 PM INFO mmp_objects: Iterating over double cut pairs dictionary -06/08/2023 09:57:47 PM INFO mmp_objects: All done! -06/08/2023 09:57:47 PM INFO getMMPfromSMI: Complete. -06/13/2023 02:10:59 PM INFO getMMPfromSMI: Instantiating MMP Objects -06/13/2023 02:10:59 PM INFO mmp_objects: Beginning pre-scan of input smiles file -06/13/2023 02:10:59 PM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/13/2023 02:10:59 PM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/13/2023 02:10:59 PM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/apps/gc3tk/c3tk-core/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate//test/getMMPfromSMI/case_2/in/test_data_02.smi -06/13/2023 02:10:59 PM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/13/2023 02:10:59 PM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/13/2023 02:10:59 PM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/13/2023 02:10:59 PM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/13/2023 02:10:59 PM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/13/2023 02:10:59 PM INFO getMMPfromSMI: Write out final pairs -06/13/2023 02:10:59 PM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/13/2023 02:10:59 PM INFO mmp_objects: Iterating over single cut pairs dictionary -06/13/2023 02:10:59 PM INFO mmp_objects: Iterating over double cut pairs dictionary -06/13/2023 02:10:59 PM INFO mmp_objects: All done! -06/13/2023 02:10:59 PM INFO getMMPfromSMI: Complete. -06/16/2023 08:48:24 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 08:48:24 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 08:48:24 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 08:48:24 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 08:48:24 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 08:48:24 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 08:48:24 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 12 -06/16/2023 08:48:24 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 12 -06/16/2023 08:48:24 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 3 -06/16/2023 08:48:24 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 08:48:24 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 08:48:24 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 08:48:24 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 08:48:24 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 08:48:24 AM INFO mmp_objects: All done! -06/16/2023 08:48:24 AM INFO getMMPfromSMI: Complete. -06/16/2023 08:51:40 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 08:51:40 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 08:51:40 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 08:51:40 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 08:51:40 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 08:51:40 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 08:51:40 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 12 -06/16/2023 08:51:40 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 12 -06/16/2023 08:51:40 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 3 -06/16/2023 08:51:40 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 08:51:40 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 08:51:40 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 08:51:40 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 08:51:40 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 08:51:40 AM INFO mmp_objects: All done! -06/16/2023 08:51:40 AM INFO getMMPfromSMI: Complete. -06/16/2023 09:42:09 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 09:42:09 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 09:42:09 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 09:42:09 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 09:42:09 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 09:42:09 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 09:42:09 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 12 -06/16/2023 09:42:09 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 12 -06/16/2023 09:42:09 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 3 -06/16/2023 09:42:09 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 09:42:09 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 09:42:09 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 09:42:09 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 09:42:09 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 09:42:09 AM INFO mmp_objects: All done! -06/16/2023 09:42:09 AM INFO getMMPfromSMI: Complete. -06/16/2023 09:49:47 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 09:49:47 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 09:49:47 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 09:49:47 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 09:49:47 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 09:49:47 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 09:49:47 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 12 -06/16/2023 09:49:47 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 12 -06/16/2023 09:49:47 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 3 -06/16/2023 09:49:47 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 09:49:47 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 09:49:47 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 09:49:47 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 09:49:47 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 09:49:47 AM INFO mmp_objects: All done! -06/16/2023 09:49:47 AM INFO getMMPfromSMI: Complete. -06/16/2023 09:53:06 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 09:53:06 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 09:53:06 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 09:53:06 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 09:53:06 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 09:53:06 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 09:53:06 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 12 -06/16/2023 09:53:06 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 12 -06/16/2023 09:53:06 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 3 -06/16/2023 09:53:06 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 09:53:06 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 09:53:06 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 09:53:06 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 09:53:06 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 09:53:06 AM INFO mmp_objects: All done! -06/16/2023 09:53:06 AM INFO getMMPfromSMI: Complete. -06/16/2023 09:55:26 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 09:55:26 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 09:55:26 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 09:55:26 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 09:55:26 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 09:55:26 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 09:55:26 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 12 -06/16/2023 09:55:26 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 12 -06/16/2023 09:55:26 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 3 -06/16/2023 09:55:26 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 09:55:26 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 09:55:26 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 09:55:26 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 09:55:26 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 09:55:26 AM INFO mmp_objects: All done! -06/16/2023 09:55:26 AM INFO getMMPfromSMI: Complete. -06/16/2023 10:07:47 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 10:07:47 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 10:07:47 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 10:07:47 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 10:07:47 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/apps/gc3tk/c3tk-core/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 10:07:47 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 10:07:47 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 10:07:47 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 10:07:47 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 10:07:47 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 10:07:47 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 10:07:47 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 10:07:47 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 10:07:47 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 10:07:47 AM INFO mmp_objects: All done! -06/16/2023 10:07:47 AM INFO getMMPfromSMI: Complete. -06/16/2023 10:10:42 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 10:10:42 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 10:10:42 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 10:10:42 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 10:10:42 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 10:10:42 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 10:10:42 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 10:10:42 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 10:10:42 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 10:10:42 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 10:10:42 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 10:10:42 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 10:10:42 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 10:10:42 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 10:10:42 AM INFO mmp_objects: All done! -06/16/2023 10:10:42 AM INFO getMMPfromSMI: Complete. -06/16/2023 10:15:42 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 10:15:42 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 10:15:42 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 10:15:42 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 10:15:42 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 10:15:42 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 10:15:42 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 10:15:42 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 10:15:42 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 10:15:42 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 10:15:42 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 10:15:42 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 10:15:42 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 10:15:42 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 10:15:42 AM INFO mmp_objects: All done! -06/16/2023 10:15:42 AM INFO getMMPfromSMI: Complete. -06/16/2023 10:17:46 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 10:17:46 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 10:17:46 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 10:17:46 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 10:17:46 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 10:17:46 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 10:17:46 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 10:17:46 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 10:17:46 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 10:17:46 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 10:17:46 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 10:17:46 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 10:17:46 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 10:17:46 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 10:17:46 AM INFO mmp_objects: All done! -06/16/2023 10:17:46 AM INFO getMMPfromSMI: Complete. -06/16/2023 10:25:10 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 10:25:10 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 10:25:10 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 10:25:10 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 10:25:10 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 10:25:10 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 10:25:10 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 10:25:10 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 10:25:10 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 10:25:10 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 10:25:10 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 10:25:10 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 10:25:10 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 10:25:10 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 10:25:10 AM INFO mmp_objects: All done! -06/16/2023 10:25:10 AM INFO getMMPfromSMI: Complete. -06/16/2023 11:28:17 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 11:28:17 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 11:28:17 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 11:28:17 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 11:28:17 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 11:28:17 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 11:28:17 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 11:28:17 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 11:28:17 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 11:28:17 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 11:28:17 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 11:28:17 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 11:28:17 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 11:28:17 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 11:28:17 AM INFO mmp_objects: All done! -06/16/2023 11:28:17 AM INFO getMMPfromSMI: Complete. -06/16/2023 11:42:46 AM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 11:42:46 AM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 11:42:46 AM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 11:42:46 AM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 11:42:46 AM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 11:42:46 AM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 11:42:46 AM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 11:42:46 AM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 11:42:46 AM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 11:42:46 AM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 11:42:46 AM INFO getMMPfromSMI: Write out final pairs -06/16/2023 11:42:46 AM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 11:42:46 AM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 11:42:46 AM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 11:42:46 AM INFO mmp_objects: All done! -06/16/2023 11:42:46 AM INFO getMMPfromSMI: Complete. -06/16/2023 12:47:05 PM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 12:47:05 PM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 12:47:05 PM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 12:47:05 PM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 12:47:05 PM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 12:47:05 PM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 12:47:05 PM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 12:47:05 PM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 12:47:05 PM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 12:47:05 PM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 12:47:05 PM INFO getMMPfromSMI: Write out final pairs -06/16/2023 12:47:05 PM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 12:47:05 PM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 12:47:05 PM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 12:47:05 PM INFO mmp_objects: All done! -06/16/2023 12:47:05 PM INFO getMMPfromSMI: Complete. -06/16/2023 12:51:42 PM INFO getMMPfromSMI: Instantiating MMP Objects -06/16/2023 12:51:42 PM INFO mmp_objects: Beginning pre-scan of input smiles file -06/16/2023 12:51:42 PM INFO mmp_objects: Completed pre-scan of input smiles file with no errors -06/16/2023 12:51:42 PM INFO getMMPfromSMI: Parse Dicer Fragments to Pairs -06/16/2023 12:51:42 PM INFO mmp_dicer_functions: Attempting execution of dicer: - /lrlhps/users/rx87690/LillyMolPrivate/bin/Linux/dicer -B atype=sb -B MAXFF=0.3 -C auto -s "ClC" -s "BrC" -s "FC" -B addq -B bscb -m 0 -M 15 -X 5000 -i smi -A I -A D -B nosmi -G iso01 -c -i ICTE -k 2 /lrlhps/users/rx87690/LillyMolPrivate/test/getMMPfromSMI/case_2/in/test_data_02.smi -06/16/2023 12:51:42 PM INFO mmp_objects: Done reading dicer output into single and double pair dicts -06/16/2023 12:51:42 PM INFO mmp_objects: mem_trace refsmi_dict entries: 328, mem usage: 9.32 -06/16/2023 12:51:42 PM INFO mmp_objects: mem_trace query_dict single entries: 106, mem usage: 4.704 -06/16/2023 12:51:42 PM INFO mmp_objects: mem_trace query_dict double entries: 24, mem usage: 1.184 -06/16/2023 12:51:42 PM INFO mmp_objects: Removed 48 and 0 duplicate fragmentation patterns from single_pairs_dict & double_pairs_dict -06/16/2023 12:51:42 PM INFO getMMPfromSMI: Write out final pairs -06/16/2023 12:51:42 PM INFO mmp_objects: Opening output file for write: test_data_02.pairs -06/16/2023 12:51:42 PM INFO mmp_objects: Iterating over single cut pairs dictionary -06/16/2023 12:51:42 PM INFO mmp_objects: Iterating over double cut pairs dictionary -06/16/2023 12:51:42 PM INFO mmp_objects: All done! -06/16/2023 12:51:42 PM INFO getMMPfromSMI: Complete. diff --git a/test/iwdescr/case_1/run_case.sh b/test/iwdescr/case_1/run_case.sh index 5c074062..9b144b47 100755 --- a/test/iwdescr/case_1/run_case.sh +++ b/test/iwdescr/case_1/run_case.sh @@ -43,7 +43,7 @@ fi echo "Testing: $command" -queries_dir="$LILLYMOL_HOME/contrib/data/queries" +queries_dir="$LILLYMOL_HOME/data/queries" $command \ -N F:${queries_dir}/charges/queries \ diff --git a/test/ring_extraction/case_1/out/ring_5Al.smi b/test/ring_extraction/case_1/out/ring_5Al.smi index a54ce17c..e0136e41 100644 --- a/test/ring_extraction/case_1/out/ring_5Al.smi +++ b/test/ring_extraction/case_1/out/ring_5Al.smi @@ -1,4 +1,4 @@ -smi: "[1CH2]1O[1CH2]CC1" smt: "[ax2r5D>2]1:[ax2r5D2]:[ax2r5D>2]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL423837.5Al" n: 2 conn: true usmi: "O1[1CH2]CC[1CH2]1" -smi: "[1CH2]1C[1NH]C(=O)C1" smt: "[ax2r5D>2]1:[ax2r5D2]:[ax2r5D>2]:[ax2r5D3](=[a]):[ax2r5D2]:1" id: "CHEMBL1545530.5Al" n: 2 conn: true usmi: "O=C1[1NH]C[1CH2]C1" smi: "[1NH]1CCCC1" smt: "[ax2r5D>2]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL2216854.5Al" n: 2 conn: true usmi: "[1NH]1CCCC1" smi: "[1CH2]1CCCC1" smt: "[ax2r5D>2]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL3639904.5Al" n: 2 conn: true usmi: "[1CH2]1CCCC1" +smi: "[1CH2]1O[1CH2]CC1" smt: "[ax2r5D>2]1:[ax2r5D2]:[ax2r5D>2]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL423837.5Al" n: 2 conn: true usmi: "O1[1CH2]CC[1CH2]1" +smi: "[1CH2]1C[1NH]C(=O)C1" smt: "[ax2r5D>2]1:[ax2r5D2]:[ax2r5D>2]:[ax2r5D3](=[a]):[ax2r5D2]:1" id: "CHEMBL1545530.5Al" n: 2 conn: true usmi: "O=C1[1NH]C[1CH2]C1" diff --git a/test/ring_extraction/case_1/out/ring_5Ar.smi b/test/ring_extraction/case_1/out/ring_5Ar.smi index be6a9878..9ed4d4fd 100644 --- a/test/ring_extraction/case_1/out/ring_5Ar.smi +++ b/test/ring_extraction/case_1/out/ring_5Ar.smi @@ -1,10 +1,10 @@ -smi: "[1CH]1=CC=[1CH][1NH]1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D3]:[ax2r5D3]:1" id: "CHEMBL1545311.5Ar" n: 2 conn: true usmi: "[1nH]1[1cH]cc[1cH]1" -smi: "S1[1CH]=NN=[1CH]1" smt: "[ax2r5D2]1:[ax2r5D3]:[ax2r5D2]:[ax2r5D2]:[ax2r5D3]:1" id: "CHEMBL1545530.5Ar" n: 2 conn: true usmi: "s1[1cH][n][n][1cH]1" -smi: "[1CH]1=NN=[1CH]O1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D3]:[ax2r5D2]:1" id: "CHEMBL1550430.5Ar" n: 2 conn: true usmi: "o1[1cH][n][n][1cH]1" -smi: "O1N=[1CH][1CH]=[1CH]1" smt: "[ax2r5D2]1:[ax2r5D2]:[ax2r5D3]:[ax2r5D3]:[ax2r5D3]:1" id: "CHEMBL1571383.5Ar" n: 2 conn: true usmi: "o1[n][1cH][1cH][1cH]1" -smi: "[1CH]1=C[1NH]N=C1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D3]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL2139474.5Ar" n: 4 conn: true usmi: "[1nH]1[n]c[1cH]c1" -smi: "[1CH]1=CC=CO1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL1706027.5Ar" n: 2 conn: true usmi: "o1[1cH]ccc1" smi: "[1CH]1=CC=CS1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL4170739.5Ar" n: 6 conn: true usmi: "s1[1cH]ccc1" +smi: "[1CH]1=C[1NH]N=C1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D3]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL2139474.5Ar" n: 4 conn: true usmi: "[1nH]1[n]c[1cH]c1" smi: "[1CH]1=[1CH][1NH]N=C1" smt: "[ax2r5D3]1:[ax2r5D3]:[ax2r5D3]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL1545189.5Ar" n: 4 conn: true usmi: "[1nH]1[n]c[1cH][1cH]1" -smi: "[1CH]1=NN=N[1NH]1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:[ax2r5D3]:1" id: "CHEMBL1545189.5Ar" n: 2 conn: true usmi: "[1nH]1[1cH][n][n][n]1" +smi: "[1CH]1=CC=CO1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL1706027.5Ar" n: 2 conn: true usmi: "o1[1cH]ccc1" smi: "[1CH]1=COC=C1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:1" id: "CHEMBL2269678.5Ar" n: 2 conn: true usmi: "o1c[1cH]cc1" +smi: "[1CH]1=CC=[1CH][1NH]1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D3]:[ax2r5D3]:1" id: "CHEMBL1545311.5Ar" n: 2 conn: true usmi: "[1nH]1[1cH]cc[1cH]1" +smi: "[1CH]1=NN=[1CH]O1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D3]:[ax2r5D2]:1" id: "CHEMBL1550430.5Ar" n: 2 conn: true usmi: "o1[1cH][n][n][1cH]1" +smi: "S1[1CH]=NN=[1CH]1" smt: "[ax2r5D2]1:[ax2r5D3]:[ax2r5D2]:[ax2r5D2]:[ax2r5D3]:1" id: "CHEMBL1545530.5Ar" n: 2 conn: true usmi: "s1[1cH][n][n][1cH]1" +smi: "[1CH]1=NN=N[1NH]1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax2r5D2]:[ax2r5D3]:1" id: "CHEMBL1545189.5Ar" n: 2 conn: true usmi: "[1nH]1[1cH][n][n][n]1" +smi: "O1N=[1CH][1CH]=[1CH]1" smt: "[ax2r5D2]1:[ax2r5D2]:[ax2r5D3]:[ax2r5D3]:[ax2r5D3]:1" id: "CHEMBL1571383.5Ar" n: 2 conn: true usmi: "o1[n][1cH][1cH][1cH]1" diff --git a/test/ring_extraction/case_1/out/ring_5Ar6Ar.smi b/test/ring_extraction/case_1/out/ring_5Ar6Ar.smi index 6b42bae2..c5d09585 100644 --- a/test/ring_extraction/case_1/out/ring_5Ar6Ar.smi +++ b/test/ring_extraction/case_1/out/ring_5Ar6Ar.smi @@ -1,4 +1,4 @@ -smi: "[1CH]1=NC2=CC=CC=C2N1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax3r5r6D3]2:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax3r5r6D3]:2:[ax2r5D2]:1" id: "CHEMBL1545805.5Ar6Ar" n: 2 conn: true usmi: "[nH]1[1cH][n]c2c1cccc2" -smi: "[1CH]1=CNC2=CC=CC=C12" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax3r5r6D3]2:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax3r5r6D3]:1:2" id: "CHEMBL1551902.5Ar6Ar" n: 2 conn: true usmi: "[nH]1c[1cH]c2c1cccc2" smi: "[1CH]1=NC2=CC=CC=C2O1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax3r5r6D3]2:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax3r5r6D3]:2:[ax2r5D2]:1" id: "CHEMBL1550921.5Ar6Ar" n: 2 conn: true usmi: "o1[1cH][n]c2c1cccc2" +smi: "[1CH]1=CNC2=CC=CC=C12" smt: "[ax2r5D3]1:[ax2r5D2]:[ax2r5D2]:[ax3r5r6D3]2:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax3r5r6D3]:1:2" id: "CHEMBL1551902.5Ar6Ar" n: 2 conn: true usmi: "[nH]1c[1cH]c2c1cccc2" +smi: "[1CH]1=NC2=CC=CC=C2N1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax3r5r6D3]2:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax3r5r6D3]:2:[ax2r5D2]:1" id: "CHEMBL1545805.5Ar6Ar" n: 2 conn: true usmi: "[nH]1[1cH][n]c2c1cccc2" smi: "[1CH]1=CC2=CN=[1CH]N=C2[1NH]1" smt: "[ax2r5D3]1:[ax2r5D2]:[ax3r5r6D3]2:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:[ax3r5r6D3]:2:[ax2r5D3]:1" id: "CHEMBL3639904.5Ar6Ar" n: 2 conn: true usmi: "[1nH]1[1cH]cc2c[n][1cH][n]c12" diff --git a/test/ring_extraction/case_1/out/ring_5Ar6Ar6Al.smi b/test/ring_extraction/case_1/out/ring_5Ar6Ar6Al.smi index 6cd78354..35035023 100644 --- a/test/ring_extraction/case_1/out/ring_5Ar6Ar6Al.smi +++ b/test/ring_extraction/case_1/out/ring_5Ar6Ar6Al.smi @@ -1,2 +1,2 @@ -smi: "S1C2=C([CH2:70][1NH][1CH]=N2)C2=C1CCCC2" smt: "[ax2r5D2]1:[ax3r5r6D3]2:[ax3r5r6D3](:[ax2r6D2]:[ax2r6D>2]:[ax2r6D>2]:[ax2r6D2]:2):[ax3r5r6D3]2:[ax3r5r6D3]:1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:2" id: "CHEMBL1553068.5Ar6Ar6Al" n: 1 conn: true exo: "[70O]" usmi: "O=c1[1nH][1cH][n]c2sc3c(c12)CCCC3" smi: "[1CH2]1CN2C(=[1CH]C3=CC=CC=C23)CC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax3r5r6D3]2:[ax3r5r6D3](:[ax2r5D3]:[ax3r5r6D3]3:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax3r5r6D3]:2:3):[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1778509.5Ar6Ar6Al" n: 2 conn: true usmi: "[1CH2]1C[n]2c([1cH]c3c2cccc3)CC1" +smi: "S1C2=C([CH2:70][1NH][1CH]=N2)C2=C1CCCC2" smt: "[ax2r5D2]1:[ax3r5r6D3]2:[ax3r5r6D3](:[ax2r6D2]:[ax2r6D>2]:[ax2r6D>2]:[ax2r6D2]:2):[ax3r5r6D3]2:[ax3r5r6D3]:1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:2" id: "CHEMBL1553068.5Ar6Ar6Al" n: 1 conn: true exo: "[70O]" usmi: "O=c1[1nH][1cH][n]c2sc3c(c12)CCCC3" diff --git a/test/ring_extraction/case_1/out/ring_6Al.smi b/test/ring_extraction/case_1/out/ring_6Al.smi index afaa2b2d..039861f5 100644 --- a/test/ring_extraction/case_1/out/ring_6Al.smi +++ b/test/ring_extraction/case_1/out/ring_6Al.smi @@ -1,8 +1,8 @@ -smi: "[1CH2]1CCNCC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1615181.6Al" n: 2 conn: true usmi: "N1CC[1CH2]CC1" +smi: "[1NH]1CC[1NH]CC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D>2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1558075.6Al" n: 10 conn: true usmi: "[1NH]1CC[1NH]CC1" +smi: "[1CH2]1CCCCC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL2107073.6Al" n: 4 conn: true usmi: "[1CH2]1CCCCC1" smi: "[1CH2]1CC[1NH]CC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D>2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1837039.6Al" n: 4 conn: true usmi: "[1NH]1CC[1CH2]CC1" smi: "[1NH]1[1CH2]CCCC1" smt: "[ax2r6D>2]1:[ax2r6D>2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1552380.6Al" n: 4 conn: true usmi: "[1NH]1[1CH2]CCCC1" -smi: "[1NH]1CC[1NH]CC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D>2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1558075.6Al" n: 10 conn: true usmi: "[1NH]1CC[1NH]CC1" smi: "C1C[1CH2]CC[1CH2]1" smt: "[ax2r6D2]1:[ax2r6D2]:[ax2r6D>2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D>2]:1" id: "CHEMBL2216854.6Al" n: 4 conn: true usmi: "[1CH2]1CC[1CH2]CC1" -smi: "[1NH]1C[1CH2]CCC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D>2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1546318.6Al" n: 2 conn: true usmi: "[1NH]1C[1CH2]CCC1" smi: "[1NH]1CCNCC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL142111.6Al" n: 2 conn: true usmi: "[1NH]1CCNCC1" -smi: "[1CH2]1CCCCC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL2107073.6Al" n: 4 conn: true usmi: "[1CH2]1CCCCC1" +smi: "[1CH2]1CCNCC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1615181.6Al" n: 2 conn: true usmi: "N1CC[1CH2]CC1" +smi: "[1NH]1C[1CH2]CCC1" smt: "[ax2r6D>2]1:[ax2r6D2]:[ax2r6D>2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1546318.6Al" n: 2 conn: true usmi: "[1NH]1C[1CH2]CCC1" diff --git a/test/ring_extraction/case_1/out/ring_6Ar.smi b/test/ring_extraction/case_1/out/ring_6Ar.smi index cdc1adcb..4c0b4975 100644 --- a/test/ring_extraction/case_1/out/ring_6Ar.smi +++ b/test/ring_extraction/case_1/out/ring_6Ar.smi @@ -1,10 +1,10 @@ -smi: "[1CH]1=CC=CN=C1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1706027.6Ar" n: 2 conn: true usmi: "[n]1c[1cH]ccc1" -smi: "[1CH]1=CC=[1CH][1CH]=C1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:[ax2r6D3]:[ax2r6D2]:1" id: "CHEMBL1547708.6Ar" n: 10 conn: true usmi: "[1cH]1c[1cH][1cH]cc1" -smi: "[1CH]1=CC=C[1CH]=C1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:1" id: "CHEMBL1547708.6Ar" n: 4 conn: true usmi: "c1[1cH]ccc[1cH]1" -smi: "[1CH]1=[1CH]C=CC=C1" smt: "[ax2r6D3]1:[ax2r6D3]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1892527.6Ar" n: 10 conn: true usmi: "[1cH]1[1cH]cccc1" -smi: "[1CH]1=CC=CC=N1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL2145147.6Ar" n: 8 conn: true usmi: "[n]1[1cH]cccc1" -smi: "[1CH]1=[1CH]C=[1CH]C=[1CH]1" smt: "[ax2r6D3]1:[ax2r6D3]:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:[ax2r6D3]:1" id: "CHEMBL1579795.6Ar" n: 4 conn: true usmi: "[1cH]1[1cH]c[1cH]c[1cH]1" smi: "[1CH]1=CC=[1CH]C=C1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1989485.6Ar" n: 40 conn: true usmi: "[1cH]1cc[1cH]cc1" smi: "[1CH]1=CC=CC=C1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1989485.6Ar" n: 26 conn: true usmi: "[1cH]1ccccc1" -smi: "[1CH]1=C[1CH]=CN=[1CH]1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:1" id: "CHEMBL1968647.6Ar" n: 4 conn: true usmi: "[n]1[1cH][1cH]c[1cH]c1" +smi: "[1CH]1=[1CH]C=CC=C1" smt: "[ax2r6D3]1:[ax2r6D3]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1892527.6Ar" n: 10 conn: true usmi: "[1cH]1[1cH]cccc1" +smi: "[1CH]1=CC=[1CH][1CH]=C1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:[ax2r6D3]:[ax2r6D2]:1" id: "CHEMBL1547708.6Ar" n: 10 conn: true usmi: "[1cH]1c[1cH][1cH]cc1" +smi: "[1CH]1=CC=CC=N1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL2145147.6Ar" n: 8 conn: true usmi: "[n]1[1cH]cccc1" +smi: "[1CH]1=CC=C[1CH]=C1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:1" id: "CHEMBL1547708.6Ar" n: 4 conn: true usmi: "c1[1cH]ccc[1cH]1" smi: "[1CH]1=CC=[1CH]C=N1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL3639904.6Ar" n: 4 conn: true usmi: "[n]1[1cH]cc[1cH]c1" +smi: "[1CH]1=C[1CH]=CN=[1CH]1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:[ax2r6D2]:[ax2r6D3]:1" id: "CHEMBL1968647.6Ar" n: 4 conn: true usmi: "[n]1[1cH][1cH]c[1cH]c1" +smi: "[1CH]1=[1CH]C=[1CH]C=[1CH]1" smt: "[ax2r6D3]1:[ax2r6D3]:[ax2r6D2]:[ax2r6D3]:[ax2r6D2]:[ax2r6D3]:1" id: "CHEMBL1579795.6Ar" n: 4 conn: true usmi: "[1cH]1[1cH]c[1cH]c[1cH]1" +smi: "[1CH]1=CC=CN=C1" smt: "[ax2r6D3]1:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:[ax2r6D2]:1" id: "CHEMBL1706027.6Ar" n: 2 conn: true usmi: "[n]1c[1cH]ccc1" diff --git a/test/ring_extraction/case_1/run_case.sh b/test/ring_extraction/case_1/run_case.sh index 770d7839..6473d9f6 100755 --- a/test/ring_extraction/case_1/run_case.sh +++ b/test/ring_extraction/case_1/run_case.sh @@ -23,15 +23,15 @@ then exit 1 fi -name1=log.txt +stdout='stdout' +stderr='stderr' diff_tool=../../fileDiff.sh pid=${$} -$command -X Ar:Al -R 7 -k -c -v -S /tmp/${pid}ring in/rings.smi >log.txt 2>err.txt +$command -X Ar:Al -R 7 -k -c -v -S /tmp/${pid}ring in/rings.smi >${stdout} 2>${stderr} status='PASS' for file in /tmp/${pid}ring_*smi ; do - # echo "Processing ${file}" diff -q $file out/$(basename ${file/${pid}/}) if [[ $? -ne 0 ]] ; then status='FAIL' @@ -39,7 +39,5 @@ for file in /tmp/${pid}ring_*smi ; do done echo "$case_id : TEST ${status}" -#rm $name1 +rm ${stdout} ${stderr} rm /tmp/${pid}ring_*smi -rm log.txt -rm err.txt diff --git a/test/run_all_test.sh b/test/run_all_test.sh index ee3f6dd4..9a98592d 100755 --- a/test/run_all_test.sh +++ b/test/run_all_test.sh @@ -1,14 +1,19 @@ #! /bin/bash -# LILLYMOL_HOME and BUILD_DIR are required to be exported before running test -if [ -z "$LILLYMOL_HOME" ] || [ -z "$BUILD_DIR" ] -then - # undefined BIN_DIR - echo "System variables LILLYMOL_HOME and BUILD_DIR are required for running the test" - echo "Please export LILLYMOL_HOME(local path to LillyMol code)" - echo "Please export BUILD_DIR(the folder name under the bin folder after build)" - echo "Example: export LILLYMOL_HOME=/home/user/LillyMol" - echo "Example: export BUILD_DIR=Linux-gcc-7.2.1" - exit 1 + +# LILLYMOL_HOME and BUILD_DIR should be exported, use my location if not set. + +if [[ ! -v LILLYMOL_HOME ]] ; then + me=$(readlink -f $0) + up=$(dirname ${me}) # LillyMol/test + export LILLYMOL_HOME=$(dirname ${up}) +fi + +if [[ ! -v BUILD_DIR ]] ; then + export BUILD_DIR=$(uname) +fi + +if [[ ! -v PYTHONPATH ]] ; then + export PYTHONPATH="${LILLYMOL_HOME}/contrib/script/py" fi for dir in ./*; do diff --git a/test/smiles_mutation/case_1/run_case.sh b/test/smiles_mutation/case_1/run_case.sh index 8f491bdd..4f06d933 100755 --- a/test/smiles_mutation/case_1/run_case.sh +++ b/test/smiles_mutation/case_1/run_case.sh @@ -28,12 +28,12 @@ name1_out=out/output.smi diff_tool=../../fileDiff.sh -$command -N 50000 -n 20 -p 5 -c 15 -C 40 in/pubchem_example.smi >${name1} 2>err.txt -# Need sort before comparision for the order issue +$command -N 10000 -n 20 -p 5 -c 15 -C 40 in/pubchem_example.smi >${name1} 2>err.txt + line_count=$(wc -l < "${name1}") -#echo $line_count -# 27000 is the trial value . It may fail for future test -if [ $line_count -ge 27000 ] +# echo $line_count +# 5000 is an arbitrary number. Beware this test is non deterministic +if [ ${line_count} -ge 5000 ] then echo "$case_id : TEST PASS" else diff --git a/test/tnass/case_1/run_case.sh b/test/tnass/case_1/run_case.sh index a2e8e6aa..b2ee787b 100755 --- a/test/tnass/case_1/run_case.sh +++ b/test/tnass/case_1/run_case.sh @@ -32,7 +32,7 @@ cmp_out="$test_cmd_top/$case/out/test.out" echo "Testing: $command" -queries_dir="$LILLYMOL_HOME/contrib/data/queries" +queries_dir="$LILLYMOL_HOME/data/queries" $command \ -q F:"${queries_dir}"/heteroatoms/unique_queries_tnass \