diff --git a/python/local/SyntheticAccessibilityScore.yaml b/python/local/SyntheticAccessibilityScore.yaml new file mode 100644 index 0000000..5ecf2cb --- /dev/null +++ b/python/local/SyntheticAccessibilityScore.yaml @@ -0,0 +1,87 @@ +id: 5ef62e8f-e15f-4675-9a2c-3b13c3265e43 +name: Synthetic Accessibility Score +description: Calculates the Synthetic Accessibility Score using the RDKit implementation. +category: Chemistry +version: 1.0.0 +serviceName: Script +serviceUri: glysade.python +executorId: Glysade.CPythonDataFxn +inputFields: +- control: + id: structureColumn + label: Select structure column + type: columnselect + filters: + - dataType: string + contentType: + - chemical/x-mdl-molfile + - chemical/x-mdl-molfile-v3000 + - chemical/x-smiles + - chemical/x-daylight-smiles + - dataType: binary + contentType: + - chemical/x-mdl-molfile + - chemical/x-mdl-molfile-v3000 + validationRules: + - type: required + message: Must select column of 2D structures + request: + id: structureColumn + dataType: string + selectorType: column +tags: +- color: '#50AF28' + text: chemistry +- color: '#c6fc00' + text: calcprop +updateBehavior: automatic +maximumOutputColumns: !!int 1 +maximumOutputTables: !!int 0 +chemistryFunction: !!bool false +script: | + from df.sascorer import calculateScore + from df.chem_helper import column_to_molecules + from df.data_transfer import (DataFunctionRequest, DataFunctionResponse, + DataType, ColumnData, string_input_field) + from rdkit.Chem import AllChem + from rdkit.Chem.MolStandardize import rdMolStandardize + + from ruse.rdkit.rdkit_utils import standardize_mol + + + def execute(request: DataFunctionRequest) -> DataFunctionResponse: + column_id = string_input_field(request, 'structureColumn') + input_column = request.inputColumns[column_id] + mols = column_to_molecules(input_column) + + # The objects used for standardizing the molecules when creating + # the scores database. + # SureChEMBL has some odd azides that the normalizer doesn't touch. + fix_azide = AllChem.ReactionFromSmarts('[N-:1]=[N:2]#[N+:3]>>[N+0:1]#[N+:2][N-:3]') + normer = rdMolStandardize.Normalizer() + uncharger = rdMolStandardize.Uncharger() + metal_disconnector = rdMolStandardize.MetalDisconnector() + + scores = [] + for m in mols: + if m is None: + scores.append(None) + else: + sm = standardize_mol(m, normer, uncharger, metal_disconnector, + fix_azide) + scores.append(calculateScore(sm)) + output_column = ColumnData(name=f'{input_column.name} SA Score', + dataType=DataType.DOUBLE, values=scores) + response = DataFunctionResponse(outputColumns=[output_column]) + return response +outputFields: +- id: column1 + source: column + type: filter + name: Output SA Score column +allowedClients: +- Analyst +- WebPlayer +demoUrl: +limitBy: none +minimumChartsVersion: