From 02792ed326c746c43b5236e5f3dec54f7cb6404f Mon Sep 17 00:00:00 2001 From: shiyu22 Date: Thu, 21 Apr 2022 14:15:28 +0800 Subject: [PATCH] Add rdkit op Signed-off-by: shiyu22 --- README.md | 99 ++++++++++++++++++++++++++++++++++++++++++++++- __init__.py | 19 +++++++++ rdkit.py | 53 +++++++++++++++++++++++++ requirements.txt | 0 result1.png | Bin 0 -> 12789 bytes result2.png | Bin 0 -> 25438 bytes 6 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 __init__.py create mode 100644 rdkit.py create mode 100644 requirements.txt create mode 100644 result1.png create mode 100644 result2.png diff --git a/README.md b/README.md index ff08d6b..788a956 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,99 @@ -# rdkit +# Molecular Fingerprinting +*author: shiyu* + +
+ +## Desription + +Molecular Fingerprinting encodes a Simplified Molecular Input Line Entry Specification (SMILES) as a fingerprint. The fingerprint can represent elements, atom pairs, or functional groups, etc., and are often used for substructure searches and similarity searches in drug discovery. + +This operator uses [RDKit](https://www.rdkit.org/docs/index.html) to generate the molecular fingerprint. + + + +
+ + + +## Code Example + +> Before running the following code, you need to install rdkit, refer to https://www.rdkit.org/docs/Install.html. +> +> ``` +> # install rdkit with conda +> $ conda install -c conda-forge rdkit +> ``` + +An example that use the Morgan algorithm to generate a fingerprint of the molecular formula 'Cc1ccc(cc1)S(=O)(=O)N'. + + *Write the pipeline in simplified style:* + +```python +import towhee + +towhee.dc(['Cc1ccc(cc1)S(=O)(=O)N']) \ + .molecular_fingerprinting.rdkit() \ + .show() +``` + + +*Write a same pipeline with explicit inputs/outputs name specifications:* + +```python +import towhee + +towhee.dc['smiles'](['Cc1ccc(cc1)S(=O)(=O)N']) \ + .molecular_fingerprinting.rdkit['smiles', 'fingerprint']() \ + .show() +``` + + + + +
+ + + +## Factory Constructor + +Create the operator via the following factory method: + +***molecular_fingerprinting.rdkit( algorithm: str = 'morgan', size: int = 2048)*** + + + +**Parameters:** + +***algorithm:*** *str* + +Which algorithm to use for fingerprinting, including 'morgan', 'daylight', 'ap', 'maccs', defaluts to 'morgan', and there is the [list of available fingerprints](https://www.rdkit.org/docs/GettingStartedInPython.html#list-of-available-fingerprints). + + + +***size:*** *int* + +The bit vector size just for morgan and daylight algorithm, defaults to 2048. + + + +
+ + + +## Interface + +An molecular fingerprinting operator takes a SMILES as input. +It uses the RDKit specified by algorithm name to generate a SMILES fingerprint. + +**Parameters:** + +***smiles:*** *str* + +A Simplified Molecular Input Line Entry Specification (SMILES). + + + +**Returns:** *bytes* + +The molecular fingerprint. diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..ce44dff --- /dev/null +++ b/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2021 Zilliz. All rights reserved. +# +# 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. + +from .rdkit import Rdkit + + +def rdkit(**kwargs): + return Rdkit(**kwargs) diff --git a/rdkit.py b/rdkit.py new file mode 100644 index 0000000..0d90cde --- /dev/null +++ b/rdkit.py @@ -0,0 +1,53 @@ +# Copyright 2021 Zilliz. All rights reserved. +# +# 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. + +from towhee import register +from towhee.operator import Operator + +from rdkit import DataStructs, Chem + +@register(output_schema=['fingerprint']) +class Rdkit(Operator): + """ + Generate molecular fingerprint with RDKit. + + Args: + algorithm (`str`): + Which algorithm to use for fingerprinting, including morgan, daylight, ap, maccs, and defaluts to 'morgan'. + size (`int`): + The bit vector size, defaults to 2048. + """ + + def __init__(self, algorithm: str = 'morgan', size: int = 2048): + self.algorithm = algorithm + self.size = size + + def __call__(self, smiles: str): + mols = Chem.MolFromSmiles(smiles) + if self.algorithm == 'daylight': + fp = Chem.RDKFingerprint(mols, fpSize=self.size) + elif self.algorithm == 'morgan': + from rdkit.Chem import AllChem + AllChem.GetMorganFingerprint + fp = AllChem.GetMorganFingerprintAsBitVect(mols, 2, self.size) + elif self.algorithm == 'ap': + from rdkit.Chem.AtomPairs import Pairs + fp = Pairs.GetAtomPairFingerprintAsBitVect(mols) + elif self.algorithm == 'maccs': + from rdkit.Chem import MACCSkeys + fp = MACCSkeys.GenMACCSKeys(mols) + + hex_fp = DataStructs.BitVectToFPSText(fp) + fingerprint = bytes.fromhex(hex_fp) + return fingerprint diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29 diff --git a/result1.png b/result1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa598ba20568e7fd3218b613b46fbab07b14066f GIT binary patch literal 12789 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 Q!j?$&fx1%JebeCo0~&^Wr~m)} literal 0 HcmV?d00001 diff --git a/result2.png b/result2.png new file mode 100644 index 0000000000000000000000000000000000000000..6d1f42402aa8dfc618e8d631b24712088546391a GIT binary patch literal 25438 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 literal 0 HcmV?d00001