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 -> }