1 package search.db;
2 
3 import util.ConnectionUtil;
4 import util.SearchUtil;
5 import util.TableOperations;
6 import chemaxon.descriptors.GenerateMD;
7 import chemaxon.jchem.db.JChemSearch;
8 import chemaxon.sss.SearchConstants;
9 import chemaxon.sss.search.JChemSearchOptions;
10import chemaxon.util.ConnectionHandler;
11
12/**
13 * Example code showing the creation of descriptor tables together with similarity searching
14 * using the measures stored in these descriptor tables. Searching using built-in similarity
15 * measures not requiring descriptor tables are also shown.
16 * 
17 * @author JChem Base team, ChemAxon Ltd.
18 */
19public final class SimilaritySearchExample {
20
21    private static final String TABLE_NAME = "similaritySearchTable";
22    private static final float DISSIMILARITY_THRESHOLD = 0.65F;
23    private static final String[] DESCRIPTORS = { "Pharmacophore", "HDonor", "HAcceptor" };
24
25    private ConnectionHandler connHandler;
26
27    public static void main(String[] args) {
28        try {
29            new SimilaritySearchExample().run();
30        } catch (Exception e) {
31            e.printStackTrace();
32        }
33    }
34
35    private void run() throws Exception {
36        connHandler = ConnectionUtil.connectToDB();
37        try {
38            TableOperations.setupMoleculeTable(connHandler, TABLE_NAME);
39            generateDescriptors();
40            performSimpleSimilaritySearch();
41            performSimilaritySearchOnDescriptorTable();
42        } finally {
43            ConnectionUtil.closeConnection(connHandler);
44        }
45    }
46
47    /**
48     * Performs similarity search on the chemical hashed fingerprints of the structures. If no
49     * descriptor table is set the similarity search is executed on the fingerprint using
50     * Tanimoto metrics.
51     */
52    private void performSimpleSimilaritySearch() throws Exception {
53        String query = "C[Si](C)(C)CC1=CC=CC=C1";
54
55        JChemSearchOptions searchOpts = new JChemSearchOptions(SearchConstants.SIMILARITY);
56        JChemSearch jcs =
57                SearchUtil.createJChemSearch(connHandler, query, TABLE_NAME, searchOpts);
58
59        searchOpts.setDissimilarityThreshold(DISSIMILARITY_THRESHOLD);
60        jcs.setSearchOptions(searchOpts);
61        jcs.setQueryStructure(query);
62
63        jcs.run();
64
65        int[] cdIDs = jcs.getResults();
66        System.out.println("Results using chemical hashed fingerprint:");
67        SearchUtil.printSearchResults(cdIDs);
68    }
69
70    /**
71     * This function executes similarity search on the descriptor table. Descriptor table is
72     * specified by the {@link JChemSearchOptions#setDescriptorName(String)} function.
73     * Descriptor tables must be previously generated. In this example code the function
74     * {@link #generateDescriptors()} generates them.
75     */
76    private void performSimilaritySearchOnDescriptorTable() throws Exception {
77        String query = "C[Si](C)(C)CC1=CC=CC=C1";
78
79        JChemSearchOptions searchOpts = new JChemSearchOptions(SearchConstants.SIMILARITY);
80        searchOpts.setDissimilarityThreshold(DISSIMILARITY_THRESHOLD);
81        JChemSearch jcs =
82                SearchUtil.createJChemSearch(connHandler, query, TABLE_NAME, searchOpts);
83
84        for (String desc : DESCRIPTORS) {
85            // Adjust search options: select descriptor name
86            searchOpts.setDescriptorName(desc);
87
88            jcs.setSearchOptions(searchOpts);
89            jcs.setQueryStructure(query);
90
91            jcs.run();
92
93            int[] cdIDs = jcs.getResults();
94            String descName = "descriptor: " + desc;
95            System.out.println("Results using " + descName);
96            SearchUtil.printSearchResults(cdIDs);
97        }
98    }
99
00    /**
01     * Generates the descriptors used for the similarity search.
02     * 
03     * @throws Exception
04     */
05    private void generateDescriptors() throws Exception {
06
07        System.out.println("Generating descriptors...");
08
09        // Set connection and table parameters for descriptor generation
10        GenerateMD gmd = new GenerateMD(DESCRIPTORS.length);
11        gmd.setConnectionHandler(connHandler);
12        gmd.setStructureTableName(TABLE_NAME);
13
14        String settings = null;
15        // You can see the list of chemaxon implemented descriptor types by entering
16        // "generatemd -L" on the console.
17
18        // Set descriptors
19        gmd.setDescriptor(0, DESCRIPTORS[0], "PF", settings, null);
20        gmd.setDescriptor(1, DESCRIPTORS[1], "HDon", settings, null);
21        gmd.setDescriptor(2, DESCRIPTORS[2], "HAcc", settings, null);
22
23        gmd.init();
24        gmd.run();
25    }
26
27}
28