diff --git a/docs/sphinx-builddir/doctrees/README.doctree b/docs/sphinx-builddir/doctrees/README.doctree index 27d0338..9335a3c 100644 Binary files a/docs/sphinx-builddir/doctrees/README.doctree and b/docs/sphinx-builddir/doctrees/README.doctree differ diff --git a/docs/sphinx-builddir/doctrees/environment.pickle b/docs/sphinx-builddir/doctrees/environment.pickle index bf8198b..c40c51b 100644 Binary files a/docs/sphinx-builddir/doctrees/environment.pickle and b/docs/sphinx-builddir/doctrees/environment.pickle differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_101_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_101_0.png new file mode 100644 index 0000000..44e9906 Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_101_0.png differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_110_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_110_0.png new file mode 100644 index 0000000..69ff963 Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_110_0.png differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_133_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_133_0.png new file mode 100644 index 0000000..9fef1ba Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_133_0.png differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_21_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_21_0.png new file mode 100644 index 0000000..871c3da Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_21_0.png differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_23_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_23_0.png new file mode 100644 index 0000000..9b2bfda Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_23_0.png differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_35_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_35_0.png new file mode 100644 index 0000000..540a452 Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_35_0.png differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_56_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_56_0.png new file mode 100644 index 0000000..5190bd8 Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_56_0.png differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_67_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_67_0.png new file mode 100644 index 0000000..69a8c36 Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_67_0.png differ diff --git a/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_71_0.png b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_71_0.png new file mode 100644 index 0000000..9b20630 Binary files /dev/null and b/docs/sphinx-builddir/doctrees/nbsphinx/notebooks_QSARtuna_Tutorial_71_0.png differ diff --git a/docs/sphinx-builddir/doctrees/notebooks/QSARtuna_Tutorial.doctree b/docs/sphinx-builddir/doctrees/notebooks/QSARtuna_Tutorial.doctree index e65a7df..ad07e31 100644 Binary files a/docs/sphinx-builddir/doctrees/notebooks/QSARtuna_Tutorial.doctree and b/docs/sphinx-builddir/doctrees/notebooks/QSARtuna_Tutorial.doctree differ diff --git a/docs/sphinx-builddir/html/README.html b/docs/sphinx-builddir/html/README.html index 88045a9..ed97a6f 100644 --- a/docs/sphinx-builddir/html/README.html +++ b/docs/sphinx-builddir/html/README.html @@ -136,6 +136,7 @@
QSARtuna Publication available here.
QSARtuna is structured around three steps:
@@ -357,7 +358,7 @@Then you can use QSARtuna inside your Notebook:
diff --git a/docs/sphinx-builddir/html/_images/mlflow-inspecting-trials.png b/docs/sphinx-builddir/html/_images/mlflow-inspecting-trials.png new file mode 100644 index 0000000..90060e0 Binary files /dev/null and b/docs/sphinx-builddir/html/_images/mlflow-inspecting-trials.png differ diff --git a/docs/sphinx-builddir/html/_images/mlflow-select-experiment.png b/docs/sphinx-builddir/html/_images/mlflow-select-experiment.png new file mode 100644 index 0000000..f4169d3 Binary files /dev/null and b/docs/sphinx-builddir/html/_images/mlflow-select-experiment.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_101_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_101_0.png new file mode 100644 index 0000000..44e9906 Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_101_0.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_110_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_110_0.png new file mode 100644 index 0000000..69ff963 Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_110_0.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_133_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_133_0.png new file mode 100644 index 0000000..9fef1ba Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_133_0.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_21_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_21_0.png new file mode 100644 index 0000000..871c3da Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_21_0.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_23_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_23_0.png new file mode 100644 index 0000000..9b2bfda Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_23_0.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_35_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_35_0.png new file mode 100644 index 0000000..540a452 Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_35_0.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_56_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_56_0.png new file mode 100644 index 0000000..5190bd8 Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_56_0.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_67_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_67_0.png new file mode 100644 index 0000000..69a8c36 Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_67_0.png differ diff --git a/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_71_0.png b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_71_0.png new file mode 100644 index 0000000..9b20630 Binary files /dev/null and b/docs/sphinx-builddir/html/_images/notebooks_QSARtuna_Tutorial_71_0.png differ diff --git a/docs/sphinx-builddir/html/_sources/README.md.txt b/docs/sphinx-builddir/html/_sources/README.md.txt index f13382f..b836e94 100644 --- a/docs/sphinx-builddir/html/_sources/README.md.txt +++ b/docs/sphinx-builddir/html/_sources/README.md.txt @@ -21,6 +21,8 @@ explainability python packages Further documentation in the GitHub pages [here](https://molecularai.github.io/QSARtuna/). +QSARtuna Publication available [here](https://doi.org/10.1021/acs.jcim.4c00457). + ### The three-step process QSARtuna is structured around three steps: @@ -266,7 +268,7 @@ conda create --name my_env_with_qsartuna python=3.10.10 jupyter pip conda activate my_env_with_qsartuna module purge # Just in case. which python # Check. Should output path that contains "my_env_with_qsartuna". -python -m pip install https://github.com/MolecularAI/QSARtuna/files/14742594/qsartuna-3.0.0.1.tar.gz +python -m pip install https://github.com/MolecularAI/QSARtuna/releases/download/3.1.0/qsartuna-3.1.0.tar.gz ``` Then you can use QSARtuna inside your Notebook: diff --git a/docs/sphinx-builddir/html/_sources/notebooks/QSARtuna_Tutorial.ipynb.txt b/docs/sphinx-builddir/html/_sources/notebooks/QSARtuna_Tutorial.ipynb.txt new file mode 100644 index 0000000..ba84fe3 --- /dev/null +++ b/docs/sphinx-builddir/html/_sources/notebooks/QSARtuna_Tutorial.ipynb.txt @@ -0,0 +1,11486 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# QSARtuna CLI Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## This tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tutorial is intended to provide a new user with the necessary background to start using QSARtuna through a command line interface (CLI).\n", + "\n", + "A separate tutorial is available describing the use of the QSARtuna GUI." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Background" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "QSARtuna is a python package to automate the model building process for *REINVENT*. These models can use a variety of algorithms to fit to your input data and most of them have one or more so-called hyper-parameters (e.g. the maximum number of trees using a *Random Forest* or the C parameter in SVRs, controlling the influence of every support vector).\n", + "\n", + "For both regression and classification tasks, QSARtuna allows you to specify input data for which the optimal hyper-parameters and a model can obtained automatically. If you want to get an idea on how the package is structured, read on otherwise you might want to skip it and The following examples should give you an idea how.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The three-step process" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "QSARtuna is structured around three steps:\n", + "1. **Hyperparameter Optimization:** \n", + " Train many models with different parameters using Optuna.\n", + " Only the training dataset is used here. \n", + " Training is usually done with cross-validation.\n", + "2. **Build (Training):**\n", + " Pick the best model from Optimization, \n", + " re-train it without cross-validation,\n", + " and optionally evaluate its performance on the test dataset.\n", + "3. **Prod-build (or build merged):** \n", + " Re-train the best-performing model on the merged training and test datasets. \n", + " This step has a drawback that there is no data left to evaluate the resulting model, \n", + " but it has a big benefit that this final model is trained on the all available data. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To use QSARtuna from Jupyter Notebook, install it with:\n", + "```\n", + "python -m pip install https://github.com/MolecularAI/QSARtuna/releases/download/3.1.0/qsartuna-3.1.0.tar.gz\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Regression example\n", + "This is a toy example of training a model that will predict molecular weight for a subset of DRD2 molecules. This example was chosen so that the whole run would take less than a minute.\n", + "\n", + "Training dataset is a CSV file. It has SMILES strings in a column named \"canonical\". It has the value that we will try to predict in column \"molwt\".\n", + "\n", + "This example has train and test (holdout) dataset ready. If you have single dataset and would like QSARtuna to split it into train and test (holdout) datasets, see the next section." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are a few lines from the input file:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "pycharm": { + "is_executing": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "canonical,activity,molwt,molwt_gt_330\r\n", + "Cc1cc(NC(=O)c2cccc(COc3ccc(Br)cc3)c2)no1,0,387.233,True\r\n", + "O=C(Nc1ccc(F)cc1F)Nc1sccc1-c1nc2ccccc2s1,0,387.4360000000001,True\r\n", + "COC(=O)c1ccccc1NC(=O)c1cc([N+](=O)[O-])nn1Cc1ccccc1,0,380.36000000000007,True\r\n", + "CCOC(=O)C(C)Sc1nc(-c2ccccc2)ccc1C#N,0,312.39400000000006,False\r\n", + "CCC(CC)NC(=O)c1nn(Cc2ccccc2)c(=O)c2ccccc12,0,349.4340000000001,True\r\n", + "Brc1ccccc1OCCCOc1cccc2cccnc12,0,358.235,True\r\n", + "CCCCn1c(COc2cccc(OC)c2)nc2ccccc21,0,310.39700000000005,False\r\n", + "CCOc1cccc(NC(=O)c2sc3nc(-c4ccc(F)cc4)ccc3c2N)c1,0,407.4700000000001,True\r\n", + "COc1ccc(S(=O)(=O)N(CC(=O)Nc2ccc(C)cc2)c2ccc(C)cc2)cc1OC,0,454.54800000000023,True\r\n" + ] + } + ], + "source": [ + "!head ../tests/data/DRD2/subset-50/train.csv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create configuration" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "QSARtuna configuration can be read from a JSON file or created in Python. Here we create it in Python." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append(\"..\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/kljk345/PycharmProjects/Public_Qptuna/D/QSARtuna/venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "# Start with the imports.\n", + "import sklearn\n", + "from optunaz.three_step_opt_build_merge import (\n", + " optimize,\n", + " buildconfig_best,\n", + " build_best,\n", + " build_merged,\n", + ")\n", + "from optunaz.config import ModelMode, OptimizationDirection\n", + "from optunaz.config.optconfig import (\n", + " OptimizationConfig,\n", + " SVR,\n", + " RandomForestRegressor,\n", + " Ridge,\n", + " Lasso,\n", + " PLSRegression,\n", + " KNeighborsRegressor\n", + ")\n", + "from optunaz.datareader import Dataset\n", + "from optunaz.descriptors import ECFP, MACCS_keys, ECFP_counts, PathFP" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Prepare hyperparameter optimization configuration.\n", + "config = OptimizationConfig(\n", + " data=Dataset(\n", + " input_column=\"canonical\", # Typical names are \"SMILES\" and \"smiles\".\n", + " response_column=\"molwt\", # Often a specific name (like here), or just \"activity\".\n", + " training_dataset_file=\"../tests/data/DRD2/subset-50/train.csv\",\n", + " test_dataset_file=\"../tests/data/DRD2/subset-50/test.csv\" # Hidden during optimization.\n", + " ),\n", + " descriptors=[\n", + " ECFP.new(),\n", + " ECFP_counts.new(),\n", + " MACCS_keys.new(),\n", + " PathFP.new()\n", + " ],\n", + " algorithms=[\n", + " SVR.new(),\n", + " RandomForestRegressor.new(n_estimators={\"low\": 5, \"high\": 10}),\n", + " Ridge.new(),\n", + " Lasso.new(),\n", + " PLSRegression.new(),\n", + " KNeighborsRegressor.new()\n", + " ],\n", + " settings=OptimizationConfig.Settings(\n", + " mode=ModelMode.REGRESSION,\n", + " cross_validation=3,\n", + " n_trials=100, # Total number of trials.\n", + " n_startup_trials=50, # Number of startup (\"random\") trials.\n", + " random_seed=42, # Seed for reproducability\n", + " direction=OptimizationDirection.MAXIMIZATION,\n", + " ),\n", + ") " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run optimization" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Setup basic logging.\n", + "import logging\n", + "from importlib import reload\n", + "reload(logging)\n", + "logging.basicConfig(level=logging.INFO)\n", + "logging.getLogger(\"train\").disabled = True # Prevent ChemProp from logging\n", + "import numpy as np\n", + "np.seterr(divide=\"ignore\")\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\", category=FutureWarning)\n", + "warnings.filterwarnings(\"ignore\", category=RuntimeWarning)\n", + "\n", + "import tqdm\n", + "from functools import partialmethod, partial\n", + "tqdm.__init__ = partialmethod(tqdm.__init__, disable=True) # Prevent tqdm in ChemProp from flooding log\n", + "\n", + "# Avoid decpreciated warnings from packages etc\n", + "import warnings\n", + "warnings.simplefilter(\"ignore\")\n", + "def warn(*args, **kwargs):\n", + " pass\n", + "warnings.warn = warn" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[I 2024-07-02 13:17:26,561] A new study created in memory with name: my_study\n", + "[I 2024-07-02 13:17:26,714] A new study created in memory with name: study_name_0\n", + "[I 2024-07-02 13:17:27,022] Trial 0 finished with value: -3594.2228073972638 and parameters: {'algorithm_name': 'RandomForestRegressor', 'RandomForestRegressor_algorithm_hash': 'f1ac01e1bba332215ccbd0c29c9ac3c3', 'max_depth__f1ac01e1bba332215ccbd0c29c9ac3c3': 3, 'n_estimators__f1ac01e1bba332215ccbd0c29c9ac3c3': 10, 'max_features__f1ac01e1bba332215ccbd0c29c9ac3c3':\n", + " | Brier loss | \n", + "Log loss | \n", + "Precision | \n", + "Recall | \n", + "F1 | \n", + "Roc auc | \n", + "
---|---|---|---|---|---|---|
calibration | \n", + "\n", + " | \n", + " | \n", + " | \n", + " | \n", + " | \n", + " |
yes | \n", + "0.184705 | \n", + "0.547129 | \n", + "0.830565 | \n", + "0.744048 | \n", + "0.784929 | \n", + "0.716536 | \n", + "
no | \n", + "0.175297 | \n", + "0.529474 | \n", + "0.811209 | \n", + "0.818452 | \n", + "0.814815 | \n", + "0.714104 | \n", + "
\n", + " | shap_value | \n", + "descriptor | \n", + "bit | \n", + "info | \n", + "
---|---|---|---|---|
2227 | \n", + "2.042023e+01 | \n", + "UnscaledPhyschemDescriptors | \n", + "7.0 | \n", + "MolWt | \n", + "
2229 | \n", + "2.025199e+01 | \n", + "UnscaledPhyschemDescriptors | \n", + "9.0 | \n", + "ExactMolWt | \n", + "
2228 | \n", + "1.802158e+01 | \n", + "UnscaledPhyschemDescriptors | \n", + "8.0 | \n", + "HeavyAtomMolWt | \n", + "
2267 | \n", + "2.387276e+00 | \n", + "UnscaledPhyschemDescriptors | \n", + "47.0 | \n", + "LabuteASA | \n", + "
2230 | \n", + "2.106653e+00 | \n", + "UnscaledPhyschemDescriptors | \n", + "10.0 | \n", + "NumValenceElectrons | \n", + "
... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "
1784 | \n", + "4.598471e-07 | \n", + "ECFP | \n", + "1785.0 | \n", + "c1(OC)c(OC)ccc(C)c1 | \n", + "
583 | \n", + "4.598471e-07 | \n", + "ECFP | \n", + "584.0 | \n", + "C1(c(cc)cc)=NS(=O)(=O)NC(C)=C1 | \n", + "
995 | \n", + "4.598471e-07 | \n", + "ECFP | \n", + "996.0 | \n", + "C(C(N)=C)(=O)N(C)C | \n", + "
845 | \n", + "4.598471e-07 | \n", + "ECFP | \n", + "846.0 | \n", + "c(c(c)C)c(O)c | \n", + "
1375 | \n", + "4.598471e-07 | \n", + "ECFP | \n", + "1376.0 | \n", + "S1(=O)(=O)N=C(c)C=C(C)N1C | \n", + "
1570 rows × 4 columns
\n", + "\n", + " | smiles | \n", + "score | \n", + "rationale | \n", + "rationale_score | \n", + "
---|---|---|---|---|
0 | \n", + "Cc1cc(NC(=O)c2cccc(COc3ccc(Br)cc3)c2)no1 | \n", + "386.097 | \n", + "c1cc(CO[CH3:1])c[cH:1]c1 | \n", + "389.151 | \n", + "
0 | \n", + "O=C(Nc1ccc(F)cc1F)Nc1sccc1-c1nc2ccccc2s1 | \n", + "389.485 | \n", + "c1c[cH:1]c[cH:1]c1N[CH2:1][NH2:1] | \n", + "388.565 | \n", + "
0 | \n", + "COC(=O)c1ccccc1NC(=O)c1cc([N+](=O)[O-])nn1Cc1c... | \n", + "384.720 | \n", + "CO[CH2:1]c1cccc[cH:1]1 | \n", + "389.151 | \n", + "
0 | \n", + "CCOC(=O)C(C)Sc1nc(-c2ccccc2)ccc1C#N | \n", + "387.110 | \n", + "c1c[cH:1]c(S[CH2:1][CH3:1])n[cH:1]1 | \n", + "388.871 | \n", + "
0 | \n", + "CCC(CC)NC(=O)c1nn(Cc2ccccc2)c(=O)c2ccccc12 | \n", + "388.997 | \n", + "n1c([CH2:1]N[CH3:1])[cH:1][cH:1][cH:1][n:1]1 | \n", + "387.854 | \n", + "