TanimotoMultiple
Calculate Similarity score for multiple
                /** Find Similarity Value of multiple selection*** Usage:* 1. Run your Similarity Query - needed, otherwise script will not run* 2. Run button script** The button script expects that SIMILARITY search * and Tanimoto metric is used. If you want to use different * metric, please see all available * https://docs.chemaxon.com/display/docs/Functions+by+Categories#dissimilarity_functions** @author David Pech <[email protected]>*/import com.im.df.api.*import com.im.df.api.chem.DissimilarityCalculatorimport chemaxon.struc.Moleculeimport chemaxon.jep.*import chemaxon.jep.context.MolContextimport chemaxon.formats.MolImporter;import chemaxon.sss.search.JChemSearchOptions;import chemaxon.standardizer.Standardizer;import com.im.df.api.capabilities.JChemEntityCapability;init = { widget ->}destroy = { widget ->}evaluate = { widget ->    def ety = dataTree.rootVertex.entity // assumes you have reference to the data tree    def edp = ety.schema.dataProvider.getEntityDataProvider(ety)    def molFld = ety.fields.items.find { it.name == 'Structure' } // find the structure field    def rs = ety.schema.dataProvider.getDefaultResultSet(dataTree, false, DFEnvironmentRO.DEV_NULL) // find the ResultSet    def rootVS = rs.getVertexState(dataTree.rootVertex) // obtain the VertexState    // define the entity Capability so that we can sniff out the query paramenters    JChemEntityCapability entityCap = DIFUtilities.findCapability(ety, JChemEntityCapability.class);    // // obtain the query paramenters from last used query    boolean isReaction = false    int bitCount = entityCap.getNumberOfOnes();    int bondCount = entityCap.getNumberOfEdges();    int fpLengthInBits = entityCap.getNumberOfInts() * 32;    MarvinStructure queryStructure; // define empty query structure (will be defined in the cycle below)    // obtain the query structure from last used query parameters        List<DFTermExpression> expressions = DIFUtilities.findSimpleFieldUsagesInQuery(rs.getLastExecutedQuery(), molFld);        for (DFTermExpression dFTermExpression : expressions) {            DFOperator operator = dFTermExpression.getOperator();            if (operator instanceof Operators.StructureOperator) {                boolean caseInsensitive = (Boolean) dFTermExpression.getOptions()                        .get(LegacyConstants.CASE_INSENSITIVE_SEARCH);                List<DFTerm> operands = dFTermExpression.getOperands();                for (DFTerm dFTerm : operands) {                    if (dFTerm instanceof DFTermValue && ((DFTermValue) dFTerm).getValue() instanceof MarvinStructure) {                        queryStructure = ((DFTermValue) dFTerm).getValue(); // assign the query structure value to a variable                    }                }            }        }        List ids = rootVS.getSelectedRowsIds() // get the IDs of the selection    // obtain the structure field from Entity    // expects Structure Entity type    DFField structureField = ety.getStructureField()    Set<DFField> set = new HashSet<DFField>();    set.add(structureField);    // obtain the data    // method expects list of IDs and a HashSet of the fields to obtain    // as we defined above, the HashSet contains only Structure field    Map rows = rootVS.getData(ids, set, DFEnvironmentRO.DEV_NULL)    // Create the dissimilarity calculator and    // set other needed parameters for the calculation    JChemSearchOptions jcso = new JChemSearchOptions(JChemSearchOptions.SIMILARITY); // set SIMILARITY search type    jcso.setDissimilarityMetric("TANIMOTO"); // use TANIMOTO metric    Molecule query = queryStructure.getNative() // obtain the chemaxon.struct.Molecule instance and set it as query    Standardizer noSt = new Standardizer("<StandardizerConfiguration><Actions></Actions></StandardizerConfiguration>")    // create Dissimilarity calculator with all needed paramenters    DissimilarityCalculator dissimilarity = new DissimilarityCalculator(isReaction, query, jcso, bitCount, bondCount, fpLengthInBits, noSt);            // cycle through the data, for each row obtain the structure    // convert it to chemaxon.struct.Molecule object    // and parse it to dissimilarity value calculator    for (row in rows.values()) {        MarvinStructure mol = row[molFld.id]        Molecule cxnMol = mol.getNative()        def dissimilarityValue = dissimilarity.computeDissimilarity(cxnMol) // caluclate Disimilarity score for selected molecule        def similarityValue = 1 - dissimilarityValue // calculate the Similarity value        println "Similarity Value is ${similarityValue}"    } }on_change = { widget, button ->   }