diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b071713..dc06f973 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,6 @@ on: pull_request: branches: - "master" - - "base-ci-env-fix" schedule: # Run a cron job once weekly on Monday - cron: "0 3 * * 1" @@ -75,6 +74,8 @@ jobs: # Ignore T019 under Windows, see https://github.com/volkamerlab/teachopencadd/issues/313 PYTEST_IGNORE_T019="--ignore=teachopencadd/talktorials/T019_md_simulation/talktorial.ipynb" + # Ignore T032 under Windows, see + PYTEST_IGNORE_T032="--ignore=teachopencadd/talktorials/T032_compound_activity_proteochemometrics/talktorial.ipynb" # Temporarily ignored notebooks, see https://github.com/volkamerlab/teachopencadd/issues/303 PYTEST_IGNORE_T008="--ignore=teachopencadd/talktorials/T008_query_pdb/talktorial.ipynb" @@ -83,9 +84,15 @@ jobs: # Temporarily ignore T019 pytest $PYTEST_ARGS teachopencadd/talktorials/ $PYTEST_IGNORE_T008 $PYTEST_IGNORE_T019 else - pytest $PYTEST_ARGS teachopencadd/talktorials/ $PYTEST_IGNORE_T008 $PYTEST_IGNORE_T019 + pytest $PYTEST_ARGS teachopencadd/talktorials/ $PYTEST_IGNORE_T008 $PYTEST_IGNORE_T019 $PYTEST_IGNORE_T032 fi + - name: Environment Information (after T032 installation) + shell: bash -l {0} + run: | + conda info --all + conda list + format: name: Black runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 9ccf82c7..6e9b51d6 100644 --- a/.gitignore +++ b/.gitignore @@ -155,4 +155,12 @@ node_modules/ # Talktorial outputs # T018 teachopencadd/talktorials/T018_automated_cadd_pipeline/data/Outputs -teachopencadd/talktorials/T018_automated_cadd_pipeline/data/PipelineInputData_Project2.csv \ No newline at end of file +teachopencadd/talktorials/T018_automated_cadd_pipeline/data/PipelineInputData_Project2.csv + +# Talktorial outputs +# T032 +teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/papyrus +teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/sequences.fasta +teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/aligned* +# Keep this file for CI purposes (ClustalO w/o email) +!teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/aligned_sequences.aln-fasta.fasta \ No newline at end of file diff --git a/devtools/test_env.yml b/devtools/test_env.yml index 0c498b89..351f9702 100644 --- a/devtools/test_env.yml +++ b/devtools/test_env.yml @@ -15,6 +15,7 @@ dependencies: # https://github.com/volkamerlab/teachopencadd/issues/299 - numpy<1.24 - scikit-learn + - scipy # API changed after v2.6, see https://github.com/volkamerlab/teachopencadd/issues/265 - tensorflow<=2.6 - seaborn @@ -44,6 +45,7 @@ dependencies: - tqdm - lxml - kissim + - mordred ## CI tests - pytest - pytest-xdist @@ -67,3 +69,12 @@ dependencies: - sphinxext-opengraph # TeachOpenCADD itself - ../ + + # T032 + # The following pip packages are currently installed in the notebook itself because they are only used there, thereby avoiding the addition of more dependencies to our already quite large environment file. + # Follow this discussion on how we try to simplify our environment setup in the future: https://github.com/volkamerlab/teachopencadd/discussions/277 + # - https://github.com/OlivierBeq/Papyrus-scripts/tarball/master + # - prodec + # - rich-msa + # Dependency for ClustalO webservice (also conda installable via -c bioconda) + # - xmltramp2 diff --git a/docs/all_talktorials.rst b/docs/all_talktorials.rst index 13a14810..96a9e5be 100644 --- a/docs/all_talktorials.rst +++ b/docs/all_talktorials.rst @@ -34,3 +34,4 @@ This is the complete list of talktorials available for online reading. Take into talktorials/T026_kinase_similarity_ifp.nblink talktorials/T027_kinase_similarity_ligand_profile.nblink talktorials/T028_kinase_similarity_compare_perspectives.nblink + talktorials/T032_compound_activity_proteochemometrics.nblink diff --git a/docs/talktorials.rst b/docs/talktorials.rst index 4c2ea220..3a4a05e7 100644 --- a/docs/talktorials.rst +++ b/docs/talktorials.rst @@ -63,6 +63,7 @@ The basis for computer-aided drug discovery talktorials/T013_query_pubchem.nblink talktorials/T021_one_hot_encoding.nblink talktorials/T022_ligand_based_screening_neural_network.nblink + talktorials/T032_compound_activity_proteochemometrics.nblink Structural biology ------------------ diff --git a/docs/talktorials/T032_compound_activity_proteochemometrics.nblink b/docs/talktorials/T032_compound_activity_proteochemometrics.nblink new file mode 100644 index 00000000..4928e682 --- /dev/null +++ b/docs/talktorials/T032_compound_activity_proteochemometrics.nblink @@ -0,0 +1 @@ +{"path": "../../teachopencadd/talktorials/T032_compound_activity_proteochemometrics/talktorial.ipynb", "extra-media": ["../../teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images"]} \ No newline at end of file diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/README.md b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/README.md new file mode 100644 index 00000000..2596f56a --- /dev/null +++ b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/README.md @@ -0,0 +1,57 @@ +# T032 · Compound activity: Proteochemometrics + +**Note:** This talktorial is a part of TeachOpenCADD, a platform that aims to teach domain-specific skills and to provide pipeline templates as starting points for research projects. + +Authors: + +- Marina Gorostiola González, 2022, [Computational Drug Discovery](https://www.universiteitleiden.nl/en/science/drug-research/drug-discovery-and-safety/computational-drug-discovery), Drug Discovery & Safety Leiden University (The Netherlands) +- Olivier J.M. Béquignon, 2022, Computational Drug Discovery, Drug Discovery & Safety Leiden University (The Netherlands) +- Willem Jespers, 2022, Computational Drug Discovery, Drug Discovery & Safety Leiden University (The Netherlands) + + +## Aim of this talktorial + +While activity data is very abundant for some protein targets, there are still a number of underexplored proteins where the use of machine learning (ML) for activity prediction is very difficult due to the lack of data. This issue can be partially solved by leveraging similarities and differences between proteins. In this talktorial, we use proteochemometrics (PCM) modeling to enrich our activity models with protein data to predict the activity of novel compounds against the four [adenosine receptor](https://journals.physiology.org/doi/full/10.1152/physrev.00049.2017) isoforms (A1, A2A, A2B, A3). + + +### Contents in *Theory* +* Proteochemometrics (PCM) modeling +* Data preparation + * Papyrus dataset + * Molecule encoding: molecular descriptors + * Protein encoding: protein descriptors +* Machine learning principles: regression + * Data splitting methods + * Regression evaluation metrics + * ML algorithm: Random Forest +* Applications of PCM in drug discovery + + +### Contents in *Practical* + +* Download Papyrus dataset +* Data preparation + * Filter activity data for targets of interest + * Align target sequences + * Calculate protein descriptors + * Calculate compound descriptors +* Proteochemometrics modeling + * Helper functions + * Preprocessing + * Model training and validation + * Random split PCM model + * Random split QSAR models + * Leave one target out split PCM model + + +### References + +* Papyrus scripts [GitHub](https://github.com/OlivierBeq/Papyrus-scripts) +* Papyrus dataset preprint: [*ChemRvix* (2021)](https://chemrxiv.org/engage/chemrxiv/article-details/617aa2467a002162403d71f0) +* Molecular descriptors (Modred): [*J. Cheminf.*, 10, (2018)](https://jcheminf.biomedcentral.com/articles/10.1186/s13321-018-0258-y) +* Protein descriptors (ProDEC) [GitHub](https://github.com/OlivierBeq/ProDEC) +* Regression metrics [(Scikit learn)](https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics) +* XGBoost [Documentation](https://xgboost.readthedocs.io/en/stable/index.html) +* Proteochemometrics review: [*Drug Discov.* (2019), **32**, 89-98](https://www.sciencedirect.com/science/article/pii/S1740674920300111?via%3Dihub) + + diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/T032_env.yml b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/T032_env.yml new file mode 100644 index 00000000..047a1676 --- /dev/null +++ b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/T032_env.yml @@ -0,0 +1,27 @@ +name: teachopencadd_t032 +channels: + - conda-forge + - defaults +dependencies: + - python>=3.8 + - pip + - jupyter + - jupyterlab>=3 + - nglview>=3 + - pandas + - numpy + - biopython<=1.77 + - rdkit==2021.09.5 + - scikit-learn + - scipy + - seaborn + # Dependencies for PCM and papyrus scripts + - mordred + - pytest + - pip: + - https://github.com/OlivierBeq/Papyrus-scripts/tarball/master + - prodec + - rich-msa + # Dependency for ClustalO webservice (also conda installable via -c bioconda) + - xmltramp2 + diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/README.md b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/README.md new file mode 100644 index 00000000..cba851e3 --- /dev/null +++ b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/README.md @@ -0,0 +1,9 @@ +# T032 · Compound activity: Proteochemometrics +## Data + +This folder stores input and output data for the Jupyter notebook. + +- `papyrus`: Directory with Papyrus bioactivity dataset downloads. +- `sequences.fasta`: Sequences of the targets of interest for PCM modelling, in FASTA format. +- `aligned_sequences.aln-fasta.fasta`: ClustalO multiple sequence alignment output, in FASTA format. +- `aligned_sequences.[...]`: Additional ClustalO output files, not needed for the talktorial. diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/aligned_sequences.aln-fasta.fasta b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/aligned_sequences.aln-fasta.fasta new file mode 100644 index 00000000..b470f755 --- /dev/null +++ b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/data/aligned_sequences.aln-fasta.fasta @@ -0,0 +1,36 @@ +>0 AA2BR_HUMAN Homo sapiens (Human) Membrane receptor->Family A G protein-coupled receptor->Small molecule receptor (family A GPCR +-----MLLETQDALYVALELVIAALSVAGNVLVCAAVGTANTLQTPTNYFLVSLAAADVA +VGLFAIPFAITISLGFCTDFYGCLFLACFVLVLTQSSIFSLLAVAVDRYLAICVPLRYKS +LVTGTRARGVIAVLWVLAFGIGLTPFLGWNSKDSATNNCTEPWDGTTNESCC---LVKCL +FENVVPMSYMVYFNFFGCVLPPLLIMLVIYIKIFLVACRQLQRTEL----MDHSRTTLQR +EIHAAKSLAMIVGIFALCWLPVHAVNCVTLFQPAQGKNKPKWAMNMAILLSHANSVVNPI +VYAYRNRDFRYTFHKIISRYLLCQADVKSGNGQ----------AGVQPALGVGL------ +------------------------------------------------------------ +------ +>1 AA1R_HUMAN Homo sapiens (Human) Membrane receptor->Family A G protein-coupled receptor->Small molecule receptor (family A GPCR) +---MPPSISAFQAAYIGIEVLIALVSVPGNVLVIWAVKVNQALRDATFCFIVSLAVADVA +VGALVIPLAILINIGPQTYFHTCLMVACPVLILTQSSILALLAIAVDRYLRVKIPLRYKM +VVTPRRAAVAIAGCWILSFVVGLTPMFGWNNLSAVER----AWA---ANGSMGEPVIKCE +FEKVISMEYMVYFNFFVWVLPPLLLMVLIYLEVFYLIRKQLNKKVSAS--SGDPQKYYGK +ELKIAKSLALILFLFALSWLPLHILNCITLFCPSC--HKPSILTYIAIFLTHGNSAMNPI +VYAFRIQKFRVTFLKIWNDHFRCQPAPPIDEDLPEE------------------------ +----------RPDD---------------------------------------------- +------ +>2 AA2AR_HUMAN Homo sapiens (Human) Membrane receptor->Family A G protein-coupled receptor->Small molecule receptor (family A GPCR +------MPIMGSSVYITVELAIAVLAILGNVLVCWAVWLNSNLQNVTNYFVVSLAAADIA +VGVLAIPFAITISTGFCAACHGCLFIACFVLVLTQSSIFSLLAIAIDRYIAIRIPLRYNG +LVTGTRAKGIIAICWVLSFAIGLTPMLGWNN-------CGQPKEGKNHSQGCGEGQVACL +FEDVVPMNYMVYFNFFACVLVPLLLMLGVYLRIFLAARRQLKQMESQPLPGERARSTLQK +EVHAAKSLAIIVGLFALCWLPLHIINCFTFFCPDC-SHAPLWLMYLAIVLSHTNSVVNPF +IYAYRIREFRQTFRKIIRSHVLRQQEPFKAAGTSARVLAAHGSDGEQVSLRLNGHPPGVW +ANGSAPHPERRPNGYALGLVSGGSAQESQGNTGLPDVELLSHELKGVCPEPPGLDDPLAQ +DGAGVS +>3 AA3R_HUMAN Homo sapiens (Human) Membrane receptor->Family A G protein-coupled receptor->Small molecule receptor (family A GPCR) +MPNNSTALSLANVTYITMEIFIGLCAIVGNVLVICVVKLNPSLQTTTFYFIVSLALADIA +VGVLVMPLAIVVSLGITIHFYSCLFMTCLLLIFTHASIMSLLAIAVDRYLRVKLTVRYKR +VTTHRRIWLALGLCWLVSFLVGLTPMFGWNMKLTSEYH-------------RNVTFLSCQ +FVSVMRMDYMVYFSFLTWIFIPLVVMCAIYLDIFYIIRNKLSLNLSN---SKETGAFYGR +EFKTAKSLFLVLFLFALSWLPLSIINCIIYFNG----EVPQLVLYMGILLSHANSMMNPI +VYAYKIKKFKETYLLILKACVVCHPSDSLDTSIEKNSE---------------------- +------------------------------------------------------------ +------ diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/PCM_model_text-01.png b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/PCM_model_text-01.png new file mode 100644 index 00000000..7fd70185 Binary files /dev/null and b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/PCM_model_text-01.png differ diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/README.md b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/README.md new file mode 100644 index 00000000..820060ba --- /dev/null +++ b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/README.md @@ -0,0 +1,8 @@ +# T032 · Compound activity: Proteochemometrics + +## Images + +This folder stores images used in the Jupyter notebook. +- `PCM_model_text-01.png` +- `papyrus_workflow.png` +- `splitting_methods.png` \ No newline at end of file diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/papyrus_workflow.png b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/papyrus_workflow.png new file mode 100644 index 00000000..0bf20e48 Binary files /dev/null and b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/papyrus_workflow.png differ diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/splitting_methods.png b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/splitting_methods.png new file mode 100644 index 00000000..9b6f4570 Binary files /dev/null and b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/images/splitting_methods.png differ diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/scripts/README.md b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/scripts/README.md new file mode 100644 index 00000000..06372122 --- /dev/null +++ b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/scripts/README.md @@ -0,0 +1,6 @@ +# T032 · Compound activity: Proteochemometrics +## Scripts + +This folder stores scripts needed for the Jupyter notebook. + +- `clustalo.py`: ClustalO REST API client. diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/scripts/clustalo.py b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/scripts/clustalo.py new file mode 100644 index 00000000..a3daf138 --- /dev/null +++ b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/scripts/clustalo.py @@ -0,0 +1,683 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +############################################################################### +# +# Copyright 2012-2022 EMBL - European Bioinformatics Institute +# +# 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. +# +# Python Client Automatically generated with: +# https://github.com/ebi-wp/webservice-clients-generator +# +# Clustal Omega (REST) web service Python client using xmltramp2. +# +# For further information see: +# https://www.ebi.ac.uk/Tools/webservices/ +# +############################################################################### + +from __future__ import print_function + +import os +import sys +import time +import requests +import platform +from xmltramp2 import xmltramp +from optparse import OptionParser + +try: + from urllib.parse import urlparse, urlencode + from urllib.request import urlopen, Request + from urllib.error import HTTPError + from urllib.request import __version__ as urllib_version +except ImportError: + from urlparse import urlparse + from urllib import urlencode + from urllib2 import urlopen, Request, HTTPError + from urllib2 import __version__ as urllib_version + +# allow unicode(str) to be used in python 3 +try: + unicode('') +except NameError: + unicode = str + +# Base URL for service +baseUrl = u'https://www.ebi.ac.uk/Tools/services/rest/clustalo' +version = u'2022-09-13 12:15' + +# Set interval for checking status +pollFreq = 3 +# Output level +outputLevel = 1 +# Debug level +debugLevel = 0 +# Number of option arguments. +numOpts = len(sys.argv) + +# Process command-line options +parser = OptionParser(add_help_option=False) + +# Tool specific options (Try to print all the commands automatically) +parser.add_option('--guidetreeout', action='store_true', help=('Output guide tree.')) +parser.add_option('--addformats', action='store_true', help=('Output additional output formats')) +parser.add_option('--dismatout', action='store_true', help=('Output distance matrix. This is only calculated if the mBed-like' + 'clustering guide tree is set to false.')) +parser.add_option('--dealign', action='store_true', help=('Remove any existing alignment (gaps) from input sequences.')) +parser.add_option('--mbed', action='store_true', help=('This option uses a sample of the input sequences and then represents' + 'all sequences as vectors to these sequences, enabling much more rapid' + 'generation of the guide tree, especially when the number of sequences' + 'is large.')) +parser.add_option('--mbediteration', action='store_true', help=('Use mBed-like clustering during subsequent iterations.')) +parser.add_option('--iterations', type=int, help=('Number of (combined guide-tree/HMM) iterations.')) +parser.add_option('--gtiterations', type=int, help=('Having set the number of combined iterations, this parameter can be' + 'changed to limit the number of guide tree iterations within the' + 'combined iterations.')) +parser.add_option('--hmmiterations', type=int, help=('Having set the number of combined iterations, this parameter can be' + 'changed to limit the number of HMM iterations within the combined' + 'iterations.')) +parser.add_option('--outfmt', type=str, help=('Format for generated multiple sequence alignment.')) +parser.add_option('--order', type=str, help=('The order in which the sequences appear in the final alignment')) +parser.add_option('--stype', type=str, help=('Defines the type of the sequences to be aligned')) +parser.add_option('--sequence', type=str, help=('Three or more sequences to be aligned can be entered directly into' + 'this box. Sequences can be in GCG, FASTA, EMBL (Nucleotide only),' + 'GenBank, PIR, NBRF, PHYLIP or UniProtKB/Swiss-Prot (Protein only)' + 'format. Partially formatted sequences are not accepted. Adding a' + 'return to the end of the sequence may help certain applications' + 'understand the input. Note that directly using data from word' + 'processors may yield unpredictable results as hidden/control' + 'characters may be present. There is currently a sequence input limit' + 'of 4000 sequences and 4MB of data.')) +# General options +parser.add_option('-h', '--help', action='store_true', help='Show this help message and exit.') +parser.add_option('--email', help='E-mail address.') +parser.add_option('--title', help='Job title.') +parser.add_option('--outdir', help='Relative directory for results.') +parser.add_option('--outfile', help='File name for results.') +parser.add_option('--outformat', help='Output format for results.') +parser.add_option('--asyncjob', action='store_true', help='Asynchronous mode.') +parser.add_option('--jobid', help='Job identifier.') +parser.add_option('--polljob', action="store_true", help='Get job result.') +parser.add_option('--pollFreq', type='int', default=3, help='Poll frequency in seconds (default 3s).') +parser.add_option('--status', action="store_true", help='Get job status.') +parser.add_option('--resultTypes', action='store_true', help='Get result types.') +parser.add_option('--params', action='store_true', help='List input parameters.') +parser.add_option('--paramDetail', help='Get details for parameter.') +parser.add_option('--quiet', action='store_true', help='Decrease output level.') +parser.add_option('--verbose', action='store_true', help='Increase output level.') +parser.add_option('--version', action='store_true', help='Prints out the version of the Client and exit.') +parser.add_option('--debugLevel', type='int', default=debugLevel, help='Debugging level.') +parser.add_option('--baseUrl', default=baseUrl, help='Base URL for service.') + +(options, args) = parser.parse_args() + +# Increase output level +if options.verbose: + outputLevel += 1 + +# Decrease output level +if options.quiet: + outputLevel -= 1 + +# Debug level +if options.debugLevel: + debugLevel = options.debugLevel + +if options.pollFreq: + pollFreq = options.pollFreq + +if options.baseUrl: + baseUrl = options.baseUrl + + +# Debug print +def printDebugMessage(functionName, message, level): + if (level <= debugLevel): + print(u'[' + functionName + u'] ' + message, file=sys.stderr) + + +# User-agent for request (see RFC2616). +def getUserAgent(): + printDebugMessage(u'getUserAgent', u'Begin', 11) + # Agent string for urllib2 library. + urllib_agent = u'Python-urllib/%s' % urllib_version + clientRevision = version + # Prepend client specific agent string. + try: + pythonversion = platform.python_version() + pythonsys = platform.system() + except ValueError: + pythonversion, pythonsys = "Unknown", "Unknown" + user_agent = u'EBI-Sample-Client/%s (%s; Python %s; %s) %s' % ( + clientRevision, os.path.basename(__file__), + pythonversion, pythonsys, urllib_agent) + printDebugMessage(u'getUserAgent', u'user_agent: ' + user_agent, 12) + printDebugMessage(u'getUserAgent', u'End', 11) + return user_agent + + +# Wrapper for a REST (HTTP GET) request +def restRequest(url): + printDebugMessage(u'restRequest', u'Begin', 11) + printDebugMessage(u'restRequest', u'url: ' + url, 11) + try: + # Set the User-agent. + user_agent = getUserAgent() + http_headers = {u'User-Agent': user_agent} + req = Request(url, None, http_headers) + # Make the request (HTTP GET). + reqH = urlopen(req) + resp = reqH.read() + contenttype = reqH.info() + + if (len(resp) > 0 and contenttype != u"image/png;charset=UTF-8" + and contenttype != u"image/jpeg;charset=UTF-8" + and contenttype != u"application/gzip;charset=UTF-8"): + try: + result = unicode(resp, u'utf-8') + except UnicodeDecodeError: + result = resp + else: + result = resp + reqH.close() + # Errors are indicated by HTTP status codes. + except HTTPError as ex: + result = requests.get(url).content + printDebugMessage(u'restRequest', u'End', 11) + return result + + +# Get input parameters list +def serviceGetParameters(): + printDebugMessage(u'serviceGetParameters', u'Begin', 1) + requestUrl = baseUrl + u'/parameters' + printDebugMessage(u'serviceGetParameters', u'requestUrl: ' + requestUrl, 2) + xmlDoc = restRequest(requestUrl) + doc = xmltramp.parse(xmlDoc) + printDebugMessage(u'serviceGetParameters', u'End', 1) + return doc[u'id':] + + +# Print list of parameters +def printGetParameters(): + printDebugMessage(u'printGetParameters', u'Begin', 1) + idList = serviceGetParameters() + for id_ in idList: + print(id_) + printDebugMessage(u'printGetParameters', u'End', 1) + + +# Get input parameter information +def serviceGetParameterDetails(paramName): + printDebugMessage(u'serviceGetParameterDetails', u'Begin', 1) + printDebugMessage(u'serviceGetParameterDetails', u'paramName: ' + paramName, 2) + requestUrl = baseUrl + u'/parameterdetails/' + paramName + printDebugMessage(u'serviceGetParameterDetails', u'requestUrl: ' + requestUrl, 2) + xmlDoc = restRequest(requestUrl) + doc = xmltramp.parse(xmlDoc) + printDebugMessage(u'serviceGetParameterDetails', u'End', 1) + return doc + + +# Print description of a parameter +def printGetParameterDetails(paramName): + printDebugMessage(u'printGetParameterDetails', u'Begin', 1) + doc = serviceGetParameterDetails(paramName) + print(unicode(doc.name) + u"\t" + unicode(doc.type)) + print(doc.description) + if hasattr(doc, 'values'): + for value in doc.values: + print(value.value) + if unicode(value.defaultValue) == u'true': + print(u'default') + print(u"\t" + unicode(value.label)) + if hasattr(value, u'properties'): + for wsProperty in value.properties: + print(u"\t" + unicode(wsProperty.key) + u"\t" + unicode(wsProperty.value)) + printDebugMessage(u'printGetParameterDetails', u'End', 1) + + +# Submit job +def serviceRun(email, title, params): + printDebugMessage(u'serviceRun', u'Begin', 1) + # Insert e-mail and title into params + params[u'email'] = email + if title: + params[u'title'] = title + requestUrl = baseUrl + u'/run/' + printDebugMessage(u'serviceRun', u'requestUrl: ' + requestUrl, 2) + + # Get the data for the other options + requestData = urlencode(params) + + printDebugMessage(u'serviceRun', u'requestData: ' + requestData, 2) + # Errors are indicated by HTTP status codes. + try: + # Set the HTTP User-agent. + user_agent = getUserAgent() + http_headers = {u'User-Agent': user_agent} + req = Request(requestUrl, None, http_headers) + # Make the submission (HTTP POST). + reqH = urlopen(req, requestData.encode(encoding=u'utf_8', errors=u'strict')) + jobId = unicode(reqH.read(), u'utf-8') + reqH.close() + except HTTPError as ex: + print(xmltramp.parse(unicode(ex.read(), u'utf-8'))[0][0]) + quit() + printDebugMessage(u'serviceRun', u'jobId: ' + jobId, 2) + printDebugMessage(u'serviceRun', u'End', 1) + return jobId + + +# Get job status +def serviceGetStatus(jobId): + printDebugMessage(u'serviceGetStatus', u'Begin', 1) + printDebugMessage(u'serviceGetStatus', u'jobId: ' + jobId, 2) + requestUrl = baseUrl + u'/status/' + jobId + printDebugMessage(u'serviceGetStatus', u'requestUrl: ' + requestUrl, 2) + status = restRequest(requestUrl) + printDebugMessage(u'serviceGetStatus', u'status: ' + status, 2) + printDebugMessage(u'serviceGetStatus', u'End', 1) + return status + + +# Print the status of a job +def printGetStatus(jobId): + printDebugMessage(u'printGetStatus', u'Begin', 1) + status = serviceGetStatus(jobId) + if outputLevel > 0: + print("Getting status for job %s" % jobId) + print(status) + if outputLevel > 0 and status == "FINISHED": + print("To get results: python %s --polljob --jobid %s" + "" % (os.path.basename(__file__), jobId)) + printDebugMessage(u'printGetStatus', u'End', 1) + + +# Get available result types for job +def serviceGetResultTypes(jobId): + printDebugMessage(u'serviceGetResultTypes', u'Begin', 1) + printDebugMessage(u'serviceGetResultTypes', u'jobId: ' + jobId, 2) + requestUrl = baseUrl + u'/resulttypes/' + jobId + printDebugMessage(u'serviceGetResultTypes', u'requestUrl: ' + requestUrl, 2) + xmlDoc = restRequest(requestUrl) + doc = xmltramp.parse(xmlDoc) + printDebugMessage(u'serviceGetResultTypes', u'End', 1) + return doc[u'type':] + + +# Print list of available result types for a job. +def printGetResultTypes(jobId): + printDebugMessage(u'printGetResultTypes', u'Begin', 1) + if outputLevel > 0: + print("Getting result types for job %s" % jobId) + + resultTypeList = serviceGetResultTypes(jobId) + if outputLevel > 0: + print("Available result types:") + for resultType in resultTypeList: + print(resultType[u'identifier']) + if hasattr(resultType, u'label'): + print(u"\t", resultType[u'label']) + if hasattr(resultType, u'description'): + print(u"\t", resultType[u'description']) + if hasattr(resultType, u'mediaType'): + print(u"\t", resultType[u'mediaType']) + if hasattr(resultType, u'fileSuffix'): + print(u"\t", resultType[u'fileSuffix']) + if outputLevel > 0: + print("To get results:\n python %s --polljob --jobid %s\n" + " python %s --polljob --outformat --jobid %s" + "" % (os.path.basename(__file__), jobId, + os.path.basename(__file__), jobId)) + printDebugMessage(u'printGetResultTypes', u'End', 1) + + +# Get result +def serviceGetResult(jobId, type_): + printDebugMessage(u'serviceGetResult', u'Begin', 1) + printDebugMessage(u'serviceGetResult', u'jobId: ' + jobId, 2) + printDebugMessage(u'serviceGetResult', u'type_: ' + type_, 2) + requestUrl = baseUrl + u'/result/' + jobId + u'/' + type_ + result = restRequest(requestUrl) + printDebugMessage(u'serviceGetResult', u'End', 1) + return result + + +# Client-side poll +def clientPoll(jobId): + printDebugMessage(u'clientPoll', u'Begin', 1) + result = u'PENDING' + while result == u'RUNNING' or result == u'PENDING': + result = serviceGetStatus(jobId) + if outputLevel > 0: + print(result) + if result == u'RUNNING' or result == u'PENDING': + time.sleep(pollFreq) + printDebugMessage(u'clientPoll', u'End', 1) + + +# Get result for a jobid +# Allows more than one output file written when 'outformat' is defined. +def getResult(jobId): + printDebugMessage(u'getResult', u'Begin', 1) + printDebugMessage(u'getResult', u'jobId: ' + jobId, 1) + if outputLevel > 1: + print("Getting results for job %s" % jobId) + # Check status and wait if necessary + clientPoll(jobId) + # Get available result types + resultTypes = serviceGetResultTypes(jobId) + + for resultType in resultTypes: + # Derive the filename for the result + if options.outfile: + filename = (options.outfile + u'.' + unicode(resultType[u'identifier']) + + u'.' + unicode(resultType[u'fileSuffix'])) + else: + filename = (jobId + u'.' + unicode(resultType[u'identifier']) + + u'.' + unicode(resultType[u'fileSuffix'])) + if options.outdir: + filepath = os.path.join(options.outdir, filename) + else: + filepath = filename + # Write a result file + + outformat_parm = str(options.outformat).split(',') + for outformat_type in outformat_parm: + outformat_type = outformat_type.replace(' ', '') + + if outformat_type == 'None': + outformat_type = None + + if not outformat_type or outformat_type == unicode(resultType[u'identifier']): + if outputLevel > 1: + print("Getting %s" % unicode(resultType[u'identifier'])) + # Get the result + result = serviceGetResult(jobId, unicode(resultType[u'identifier'])) + if (unicode(resultType[u'mediaType']) == u"image/png" + or unicode(resultType[u'mediaType']) == u"image/jpeg" + or unicode(resultType[u'mediaType']) == u"application/gzip"): + fmode = 'wb' + else: + fmode = 'w' + + try: + fh = open(filepath, fmode) + fh.write(result) + fh.close() + except TypeError: + fh.close() + fh = open(filepath, "wb") + fh.write(result) + fh.close() + if outputLevel > 0: + print("Creating result file: " + filepath) + printDebugMessage(u'getResult', u'End', 1) + + +# Read a file +def readFile(filename): + printDebugMessage(u'readFile', u'Begin', 1) + fh = open(filename, 'r') + data = fh.read() + fh.close() + printDebugMessage(u'readFile', u'End', 1) + return data + + +def print_usage(): + print("""\ +EMBL-EBI Clustal Omega Python Client: + +Multiple sequence alignment with Clustal Omega. + +[Required (for job submission)] + --email E-mail address. + --stype Defines the type of the sequences to be aligned. + --sequence Three or more sequences to be aligned can be entered + directly into this box. Sequences can be in GCG, FASTA, EMBL + (Nucleotide only), GenBank, PIR, NBRF, PHYLIP or + UniProtKB/Swiss-Prot (Protein only) format. Partially + formatted sequences are not accepted. Adding a return to the + end of the sequence may help certain applications understand + the input. Note that directly using data from word + processors may yield unpredictable results as hidden/control + characters may be present. There is currently a sequence + input limit of 4000 sequences and 4MB of data. + +[Optional] + --guidetreeout Output guide tree. + --addformats Output additional output formats. + --dismatout Output distance matrix. This is only calculated if the mBed- + like clustering guide tree is set to false. + --dealign Remove any existing alignment (gaps) from input sequences. + --mbed This option uses a sample of the input sequences and then + represents all sequences as vectors to these sequences, + enabling much more rapid generation of the guide tree, + especially when the number of sequences is large. + --mbediteration Use mBed-like clustering during subsequent iterations. + --iterations Number of (combined guide-tree/HMM) iterations. + --gtiterations Having set the number of combined iterations, this parameter + can be changed to limit the number of guide tree iterations + within the combined iterations. + --hmmiterations Having set the number of combined iterations, this parameter + can be changed to limit the number of HMM iterations within + the combined iterations. + --outfmt Format for generated multiple sequence alignment. + --order The order in which the sequences appear in the final + alignment. + +[General] + -h, --help Show this help message and exit. + --asyncjob Forces to make an asynchronous query. + --title Title for job. + --status Get job status. + --resultTypes Get available result types for job. + --polljob Poll for the status of a job. + --pollFreq Poll frequency in seconds (default 3s). + --jobid JobId that was returned when an asynchronous job was submitted. + --outfile File name for results (default is JobId; for STDOUT). + --outformat Result format(s) to retrieve. It accepts comma-separated values. + --params List input parameters. + --paramDetail Display details for input parameter. + --verbose Increase output. + --version Prints out the version of the Client and exit. + --quiet Decrease output. + --baseUrl Base URL. Defaults to: + https://www.ebi.ac.uk/Tools/services/rest/clustalo + +Synchronous job: + The results/errors are returned as soon as the job is finished. + Usage: python clustalo.py --email [options...] + Returns: results as an attachment + +Asynchronous job: + Use this if you want to retrieve the results at a later time. The results + are stored for up to 24 hours. + Usage: python clustalo.py --asyncjob --email [options...] + Returns: jobid + +Check status of Asynchronous job: + Usage: python clustalo.py --status --jobid + +Retrieve job data: + Use the jobid to query for the status of the job. If the job is finished, + it also returns the results/errors. + Usage: python clustalo.py --polljob --jobid [--outfile string] + Returns: string indicating the status of the job and if applicable, results + as an attachment. + +Further information: + https://www.ebi.ac.uk/Tools/webservices and + https://github.com/ebi-wp/webservice-clients + +Support/Feedback: + https://www.ebi.ac.uk/support/""") + + +# No options... print help. +if numOpts < 2: + print_usage() +elif options.help: + print_usage() +# List parameters +elif options.params: + printGetParameters() +# Get parameter details +elif options.paramDetail: + printGetParameterDetails(options.paramDetail) +# Print Client version +elif options.version: + print("Revision: %s" % version) + sys.exit() +# Submit job +elif options.email and not options.jobid: + params = {} + if len(args) == 1 and "true" not in args and "false" not in args: + if os.path.exists(args[0]): # Read file into content + params[u'sequence'] = readFile(args[0]) + else: # Argument is a sequence id + params[u'sequence'] = args[0] + elif len(args) == 2 and "true" not in args and "false" not in args: + if os.path.exists(args[0]) and os.path.exists(args[1]): # Read file into content + params[u'asequence'] = readFile(args[0]) + params[u'bsequence'] = readFile(args[1]) + else: # Argument is a sequence id + params[u'asequence'] = args[0] + params[u'bsequence'] = args[0] + elif hasattr(options, "sequence") or (hasattr(options, "asequence") and hasattr(options, "bsequence")): # Specified via option + if hasattr(options, "sequence"): + if os.path.exists(options.sequence): # Read file into content + params[u'sequence'] = readFile(options.sequence) + else: # Argument is a sequence id + params[u'sequence'] = options.sequence + elif hasattr(options, "asequence") and hasattr(options, "bsequence"): + if os.path.exists(options.asequence) and os.path.exists(options.bsequence): # Read file into content + params[u'asequence'] = readFile(options.asequence) + params[u'bsequence'] = readFile(options.bsequence) + else: # Argument is a sequence id + params[u'asequence'] = options.asequence + params[u'bsequence'] = options.bsequence + + # Pass default values and fix bools (without default value) + if options.stype: + params['stype'] = options.stype + + if not options.guidetreeout: + params['guidetreeout'] = 'true' + if options.guidetreeout: + params['guidetreeout'] = options.guidetreeout + + + if not options.addformats: + params['addformats'] = 'false' + if options.addformats: + params['addformats'] = options.addformats + + + if not options.dismatout: + params['dismatout'] = 'false' + if options.dismatout: + params['dismatout'] = options.dismatout + + + if not options.dealign: + params['dealign'] = 'false' + if options.dealign: + params['dealign'] = options.dealign + + + if not options.mbed: + params['mbed'] = 'true' + if options.mbed: + params['mbed'] = options.mbed + + + if not options.mbediteration: + params['mbediteration'] = 'true' + if options.mbediteration: + params['mbediteration'] = options.mbediteration + + + if not options.iterations: + params['iterations'] = 0 + if options.iterations: + params['iterations'] = options.iterations + + + if not options.gtiterations: + params['gtiterations'] = -1 + if options.gtiterations: + params['gtiterations'] = options.gtiterations + + + if not options.hmmiterations: + params['hmmiterations'] = -1 + if options.hmmiterations: + params['hmmiterations'] = options.hmmiterations + + + if not options.outfmt: + params['outfmt'] = 'clustal_num' + if options.outfmt: + params['outfmt'] = options.outfmt + + + if not options.order: + params['order'] = 'aligned' + if options.order: + params['order'] = options.order + + + + # Submit the job + jobId = serviceRun(options.email, options.title, params) + if options.asyncjob: # Async mode + print(jobId) + if outputLevel > 0: + print("To check status: python %s --status --jobid %s" + "" % (os.path.basename(__file__), jobId)) + else: + # Sync mode + if outputLevel > 0: + print("JobId: " + jobId, file=sys.stderr) + else: + print(jobId) + time.sleep(pollFreq) + getResult(jobId) +# Get job status +elif options.jobid and options.status: + printGetStatus(options.jobid) + +elif options.jobid and (options.resultTypes or options.polljob): + status = serviceGetStatus(options.jobid) + if status == 'PENDING' or status == 'RUNNING': + print("Error: Job status is %s. " + "To get result types the job must be finished." % status) + quit() + # List result types for job + if options.resultTypes: + printGetResultTypes(options.jobid) + # Get results for job + elif options.polljob: + getResult(options.jobid) +else: + # Checks for 'email' parameter + if not options.email: + print('\nParameter "--email" is missing in your command. It is required!\n') + + print(u'Error: unrecognised argument combination', file=sys.stderr) + print_usage() diff --git a/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/talktorial.ipynb b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/talktorial.ipynb new file mode 100644 index 00000000..cb3ecb48 --- /dev/null +++ b/teachopencadd/talktorials/T032_compound_activity_proteochemometrics/talktorial.ipynb @@ -0,0 +1,3148 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# T032 · Compound activity: Proteochemometrics\n", + "\n", + "**Note:** This talktorial is a part of TeachOpenCADD, a platform that aims to teach domain-specific skills and to provide pipeline templates as starting points for research projects.\n", + "\n", + "Authors:\n", + "\n", + "- Marina Gorostiola González, 2022, [Computational Drug Discovery](https://www.universiteitleiden.nl/en/science/drug-research/drug-discovery-and-safety/computational-drug-discovery), Drug Discovery & Safety Leiden University (The Netherlands)\n", + "- Olivier J.M. Béquignon, 2022, Computational Drug Discovery, Drug Discovery & Safety Leiden University (The Netherlands)\n", + "- Willem Jespers, 2022, Computational Drug Discovery, Drug Discovery & Safety Leiden University (The Netherlands)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aim of this talktorial\n", + "\n", + "While activity data is very abundant for some protein targets, there are still a number of underexplored proteins where the use of machine learning (ML) for activity prediction is very difficult due to the lack of data. This issue can be partially solved by leveraging similarities and differences between proteins. In this talktorial, we use proteochemometrics (PCM) modeling to enrich our activity models with protein data to predict the activity of novel compounds against the four [adenosine receptor](https://journals.physiology.org/doi/full/10.1152/physrev.00049.2017) isoforms (A1, A2A, A2B, A3)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Contents in *Theory*\n", + "* Proteochemometrics (PCM) modeling\n", + "* Data preparation\n", + " * Papyrus dataset\n", + " * Molecule encoding: molecular descriptors\n", + " * Protein encoding: protein descriptors\n", + "* Machine learning principles: regression\n", + " * Data splitting methods\n", + " * Regression evaluation metrics\n", + " * ML algorithm: Random Forest\n", + "* Applications of PCM in drug discovery" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Contents in *Practical*\n", + "\n", + "* Download Papyrus dataset\n", + "* Data preparation\n", + " * Filter activity data for targets of interest\n", + " * Align target sequences\n", + " * Calculate protein descriptors\n", + " * Calculate compound descriptors\n", + "* Proteochemometrics modeling\n", + " * Helper functions\n", + " * Preprocessing\n", + " * Model training and validation\n", + " * Random split PCM model\n", + " * Random split QSAR models\n", + " * Leave one target out split PCM model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### References\n", + "\n", + "* Papyrus scripts [GitHub](https://github.com/OlivierBeq/Papyrus-scripts)\n", + "* Papyrus dataset preprint: [*ChemRvix* (2021)](https://chemrxiv.org/engage/chemrxiv/article-details/617aa2467a002162403d71f0)\n", + "* Molecular descriptors (Modred): [*J. Cheminf.*, 10, (2018)](https://jcheminf.biomedcentral.com/articles/10.1186/s13321-018-0258-y)\n", + "* Protein descriptors (ProDEC) [GitHub](https://github.com/OlivierBeq/ProDEC)\n", + "* Regression metrics [(Scikit learn)](https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics)\n", + "* XGBoost [Documentation](https://xgboost.readthedocs.io/en/stable/index.html)\n", + "* Proteochemometrics review: [*Drug Discov.* (2019), **32**, 89-98](https://www.sciencedirect.com/science/article/pii/S1740674920300111?via%3Dihub)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Theory" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Proteochemometrics (PCM) modeling" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Proteochemometrics (PCM) models a biological endpoint (e.g. compound activity) via supervised ML algorithms based on a series of features derived from chemical compounds and target proteins. PCM is an extension of a more widespread bioactivity modeling technique, Quantitative Structure Activity Relationship (QSAR) modeling, which relies solely on chemical features and that was introduced on **Talktorial T007**. Explore that talktorial to know more about the basic principle of activity prediction using ML.\n", + "\n", + "To successfully apply PCM modeling, we need a large dataset of molecule-protein pairs with known bioactivity values, a way of describing molecules and proteins, and an ML algorithm to train a model. Then, we can make predictions for new molecule-protein pairs.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "*Figure 1:*\n", + "Proteochemometrics modeling construction from protein and molecular descriptors for which protein-compound pair bioactivity data is known.\n", + "Figure made by Marina Gorostiola González." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data preparation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Papyrus dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The Papyrus dataset is a highly curated compilation of bioactivity data intended for modeling in drug discovery. Apart from the bioactivity data contained in the [ChEMBL database](https://www.ebi.ac.uk/chembl/) (see also **Talktorial T001**), the Papyrus dataset contains binary data for classification tasks from the [ExCAPE-DB](https://solr.ideaconsult.net/search/excape/), and bioactivity data from a number of kinase-specific papers (Figure 1). The Papyrus dataset consists of almost 60M compound-protein pairs, representing data of around 1.2M unique compounds and 7K proteins across 499 different organisms.\n", + "\n", + "The aggregated bioactivity data is standardized, repaired, and normalized to form the Papyrus dataset, which is updated with every new version of ChEMBL released. The Papyrus dataset contains \"high quality\" data associated with pChEMBL values for regression or classification tasks. pChEMBL value is a canonical activity metric defined as $-log_{10}(molar IC_{50}, XC_{50}, EC_{50}, AC_{50}, Ki, Kd, or potency)$. Moreover, \"low quality\" data that is only associated with an active/inactive label can be used for classification tasks (read more about ML applications in **Talktorial T007**)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "*Figure 2:*\n", + "Papyrus dataset generation scheme.\n", + "Figure taken from: Papyrus scripts [GitHub](https://github.com/OlivierBeq/Papyrus-scripts)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Molecule encoding: molecular descriptors" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "For the ML models used in PCM, molecules need to be converted into a list of features. In **Talktorial T007**, molecular fingerprints were introduced. In this talktorial, we will use a different type of representation that is often used on its own or in combination with fingerprints: molecular descriptors.\n", + "\n", + "**Molecular descriptors** are the \"final result of a logical and mathematical procedure, which transforms chemical information encoded within a symbolic representation of a molecule into a useful number or the result of some standardized experiment\" ([*J. Cheminf.*, 10, (2018)](https://jcheminf.biomedcentral.com/articles/10.1186/s13321-018-0258-y)). These descriptors can be, for example, molecular weight, ring count, Eccentric Connectivity Index (calculated from the 2D structure), or Geometrical Index (calculated from the 3D structure).\n", + "\n", + "In this talktorial, we use [Modred](https://github.com/mordred-descriptor/mordred) as a software engine to calculate molecular descriptors. Modred calculates more than 1,800 molecular descriptors, including the ones implemented in RDKit. The algorithm starts with an automatic preprocessing step that is common for all possible descriptors calculated. For simplicity, here we calculate only four types of descriptors from the vast list of possibilities from Modred, excluding their 3D representation. These four descriptors are:\n", + "\n", + "* **ABC Index**: 2 descriptors that represent the atom-bond connectivity index or the Graovac-Ghorbani atom-bond connectivity index (see Modred `ABCIndex` [docs](https://mordred-descriptor.github.io/documentation/master/api/mordred.ABCIndex.html))\n", + "* **Acid-Base**: 2 descriptors that count acidic and basic groups, respectively (see Modred `AcidBase` [docs](https://mordred-descriptor.github.io/documentation/master/api/mordred.AcidBase.html?highlight=acidbase))\n", + "* **Atom count**: 16 descriptors that represent a count of different types of atoms (see Modred `AtomCount` [docs](https://mordred-descriptor.github.io/documentation/master/api/mordred.AtomCount.html?highlight=atomcount))\n", + "* **Balaban J index**: 1 descriptor that represents a topological index (see Modred `BalabanJ` [docs](https://mordred-descriptor.github.io/documentation/master/api/mordred.BalabanJ.html?highlight=balaban#module-mordred.BalabanJ))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Protein encoding: protein descriptors" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "As done for molecules, the proteins of interest need to be converted to a list of features or protein descriptors. Protein descriptors used in PCM applications are commonly based on the protein sequence and represent physicochemical characteristics of the amino acids that make up the sequence (e.g. Z-scales). Other protein descriptors represent topological (e.g. ST-scales) or electrostatic properties (e.g. MS-WHIM) of the protein sequence. Moreover, if structural information is available, protein descriptors can be derived from the 3D structure of the protein (e.g. sPairs) or the ligand-protein interaction in 3D (e.g. interaction fingerprints). Finally, with the widespread use of deep learning, protein embeddings can be obtained after parsing the protein sequence through the network (e.g. UniRep, AlphaFold embeddings). To read more about protein descriptors, check out this selection of articles ([*Brief. Bioinform.*,18, (2017)](https://pubmed.ncbi.nlm.nih.gov/26873661/), [*Int. J. Mol. Sci.*, 22, (2021)](https://pubmed.ncbi.nlm.nih.gov/34884688/), [*Comput. Struct. Biotechnol. J.*, 20, (2022)](https://pubmed.ncbi.nlm.nih.gov/35222841/)).\n", + "\n", + "For protein descriptors based on the protein sequence, an aspect to take into account is that for ML the length of the protein descriptor needs to be the same. However, most proteins do not have the same sequence length. To solve this issue, there are two main approaches:\n", + "\n", + "* **Multiple sequence alignment (MSA)**: If the entire protein is to be included in the model, an MSA can be performed. The final descriptor has as many entries as the number of features per amino acid multiplied by the number of aligned positions. To account for gaps in the alignment, zeros are introduced in the descriptor. An MSA is a tool to identify common patterns between three or more biological sequences, usually DNA, RNA, or protein. One of the most common tools to perform MSA is Clustal Omega (or ClustalO), available as a [webtool](https://www.ebi.ac.uk/Tools/msa/clustalo/).\n", + "* **Binding pocket selection**: To avoid unnecessary features, a binding pocket of the same length can be selected for each protein. Normally, the binding pocket selection is preceded by a multiple sequence alignment and driven by known structural or mutagenesis data.\n", + "\n", + "Other options are available when proteins are not of the same family or do not share a binding pocket (see [*Drug Discov.* (2019), **32**, 89-98](https://www.sciencedirect.com/science/article/pii/S1740674920300111?via%3Dihub))\n", + "\n", + "In this talktorial, we will focus on physicochemical protein descriptors, mainly **Z-scales** ([*J. Med. Chem*, 30 (1987)](https://pubs.acs.org/doi/10.1021/jm00390a003)). The Z-scales descriptor assigns three pre-determined values (Z~1~, Z~2~, Z~3~) to each amino acid in the sequence. The Z~1~, Z~2~, and Z~3~ values are the first principal components of a principal component analysis (PCA) including 29 different physicochemical variables to characterize the amino acids.\n", + "Since we are calculating activity for four proteins with very high sequence similarity (Adenosine receptors A1, A2A, A2B, and A3), we will use **multiple sequence alignment** prior to calculation of the Z-scales. To calculate Z-scales we will use [ProDEC](https://github.com/OlivierBeq/ProDEC), an open source resource that compiles a large number of protein descriptors." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Machine learning principles: regression" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ML principles for PCM modeling are equivalent to those explained for QSAR modeling. However, in this talktorial we will explore a supervised ML application other than classification, this is **regression**. For regression tasks, a continuous target variable is needed, for example pChEMBL values.\n", + "\n", + "**Note**: Target variable is the variable we want to predict in ML. Not to be confused with (protein) target." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Data splitting methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly to classification tasks, in supervised ML regression applications the model is first fitted to a training set and subsequently the predictive performance is evaluated on a test set. Therefore, the original dataset needs to be split between training and test sets. The split needs to ensure that the fitting process has enough data, and that the test set is representative. Normally, the distribution between train and test set is 80/20 or 70/30. Depending on the applicability domain, the split can be done in multiple ways. In PCM modeling, some of the most common splitting methods are:\n", + "\n", + "* **Random split**: This method is not particularly relevant in drug discovery applications as it does not reflect the reality of a drug discovery campaign and it will most likely lead to data leaks between the training and test set. This is, very similar data will be found in both sets, which will lead to an overestimation of the predictive performance of the model. This type of split is commonly used, however, as a baseline and point of reference for other splitting methods, or as a starting point for quick model comparisons.\n", + "* **Leave one target out (LOTO) split**: To evaluate the ability of the model to extrapolate to targets not previously seen, one of the targets can be completely moved to the test set. In a big enough set, instead of one \"some\" targets can be moved to the test set (i.e. Leave some targets out, or LSTO).\n", + "* **Leave one compound cluster out (LOCCO) split**: This method evaluates the ability of the model to extrapolate to compounds with properties not previously seen by the model. Clustering can be done based on different molecular characteristics, such as physicochemical properties or scaffold, for example (see **Talktorial T005** to learn more about clustering). One (or several, LSCCO) cluster(s) can then be left out for testing. This method prevents data leaking in terms of chemistry between training and test sets.\n", + "* **Temporal split**: This method was developed in order to account for the usual timeline of drug discovery campaigns, where chemical series are populated sequentially over time. In this approach, the molecules included in the training set are those released until a certain date and the rest (most novel) are included in the test set.\n", + "* **Stratified split per target**: This method can be applied to any of the splitting methods described above (except LOTO), and aims to include data of all targets in both the training and test set, so that additional target-compound interactions can be extracted by the model. (**NOTE:** stratification can be also done in regards to other reference points apart from targets, for example classes in classification tasks, to make sure that the distribution is similar across training and test set)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "\n", + "\n", + "*Figure 3:*\n", + "Overview of splitting methods, including target-stratified random and temporal splits and leave one target out approach.\n", + "Figure made by Marina Gorostiola González." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Regression evaluation metrics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "To evaluate the predictive performance of a regression model, there are several metrics that in simple terms measure the differences between the true target values and the predictions made by the model. These metrics can be used in cross-validation on the training set (see **Talktorial T007**) or in the test set. The most commonly used metrics include:\n", + "\n", + "* **Coefficient of determination (**$R^{2}$ **score)**: Represents the portion of variance of the target variable that has been explained by the independent variables (features) in the model. $R^{2}$ score varies between 1.0 (best score) and minus infinite, where 0.0 represents a model that always predicts the average target variable. As the variance is dataset-dependent, it might not be a meaningful metric to compare between datasets. When dealing with linear regression, and model fitting and evaluation are performed on a single dataset, $R^{2}$ is equivalent to the square of the Pearson correlation coefficient, described below, and can be noted as $r^{2}$.\n", + "* **Pearson's correlation coefficient (Pearson's** $r$**)**: Is a measure of the linear correlation between the true and predicted values of the target variable. It is calculated as the covariance of the two variables divided by the product of their standard deviation. Pearson's $r$ can vary between 1.0 (a perfect positive correlation) and -1.0 (a perfect negative correlation), where 1.0 would represent a perfect prediction.\n", + "* **Mean absolute error (MAE)**: Measures the average absolute difference between the predicted and the true values. MAE is interpreted based on the scale of the data, and it varies between infinite and 0.0 (best).\n", + "* **Mean squared error (MSE)**: Measures the average of the squares of the difference between the predicted and the true values. It varies between infinite and 0.0 (best).\n", + "* **Root mean square error (RMSE)**: It is the square root of the MSE and represents the standard deviation of the prediction errors with respect to the line of best fit. RMSE is a measure of accuracy and it cannot be applied to compare between datasets, as it is scale-dependent. It varies between infinite and 0.0 (best).\n", + "\n", + "To learn more about evaluation metrics, you can consult scikit learn's `regression metrics` [Docs](https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### ML algorithm: Random Forest" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Different ML algorithms can be used to train PCM models. Some of them include support vector machines (SVM), **random forest (RF)**, and neural networks (NN), which were described in **Talktorial T007**. RF models have been used extensively in PCM applications due to their efficiency in large datasets and resistance to overfitting with more features. However, deep learning applications are also gaining momentum. See [*J. Cheminform.*, 45, (2017)](https://pubmed.ncbi.nlm.nih.gov/29086168/) for a comparative use of ML methods in PCM modeling.\n", + "In this talktorial, we will use RF. RF is a decision tree-based algorithm, more in detail a bagging ensemble method. This means that there are multiple decision trees trained independently with subsets of features and data and the final prediction is made from a consensus between the independent predictions.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Applications of PCM in drug discovery" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "The possibility to predict bioactivity for multiple targets in one model with PCM is very interesting in drug discovery and expands the applicability domain of QSAR modeling. Some applications of this technique are listed below and help answer the following questions in drug discovery:\n", + "\n", + "* **Poly-pharmacology**: Is it possible to target several proteins of interest simultaneously with one single drug?\n", + "* **Off-target prediction**: What other proteins do these compounds target apart from the intended therapeutic target? Are maybe these off-targets responsible for side effects?\n", + "* **Selectivity prediction**: Do certain novel compounds target one protein isoform while avoiding others (off-targets) known to cause adverse effects?\n", + "\n", + "To know more about applications of PCM in drug discovery, have a look at this review [*Drug Discov.* (2019), **32**, 89-98](https://www.sciencedirect.com/science/article/pii/S1740674920300111?via%3Dihub)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Practical" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the practical section of this talktorial we will create a PCM regression model for the four adenosine receptors (A1, A2A, A2B, A3) with data from the Papyrus dataset and molecular and protein descriptors as features." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we start, let's install a few packages that are not part of TeachOpenCADD's [global environment file](https://github.com/volkamerlab/teachopencadd/blob/master/devtools/test_env.yml) because they are only relevant to this notebook (this setup will change in the future, see discussion [here](https://github.com/volkamerlab/teachopencadd/discussions/277))." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install prodec rich-msa xmltramp2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install git+https://github.com/OlivierBeq/Papyrus-scripts.git" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import json\n", + "from pathlib import Path\n", + "import re\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "from sklearn.preprocessing import RobustScaler\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.metrics import r2_score, mean_absolute_error\n", + "from scipy.stats import pearsonr\n", + "import Bio\n", + "import Bio.SeqIO as Bio_SeqIO\n", + "from rdkit import Chem\n", + "import rich\n", + "import rich_msa\n", + "import papyrus_scripts\n", + "import mordred\n", + "import mordred.descriptors as mordred_descriptors\n", + "import prodec" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Set path to this notebook\n", + "HERE = Path(_dh[-1])\n", + "DATA = HERE / \"data\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: We will lateron use the ClustalO web service to align multiple sequences. In order to use the service, we need to provide an email address (see the [docs](https://www.ebi.ac.uk/seqdb/confluence/display/JDSAT/Clustal+Omega+Help+and+Documentation)).\n", + "Please set your email address here; for the purpose of this template talktorial, we set the email to `None` and use pre-calculated data (see \"Practical\" section of this talktorial and [this discussion](https://github.com/volkamerlab/teachopencadd/discussions/283))." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Set your email for the ClustalO service\n", + "# Replace None with your email address\n", + "MY_EMAIL = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Download Papyrus dataset" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To work with the Papyrus dataset, we use the `papyrus_scripts` [library](https://github.com/OlivierBeq/Papyrus-scripts). This library allows us to download, read, and explore the dataset. Many other features, including bioactivity modeling, are possible using the `papyrus_scripts`. If you want to dive into them, feel free to follow the [notebook with simple examples](https://github.com/OlivierBeq/Papyrus-scripts/blob/master/notebook_examples/simple_examples.ipynb). By default, the `download_papyrus` function retrieves bioactivity, target and other information for the latest version of the Papyrus dataset. The data retrieved consists of the highest quality continuous bioactivity data (Papyrus++) without stereochemistry annotated (i.e. `nostereo=True` and `stereo=False`). Check out the [documentation](https://github.com/OlivierBeq/Papyrus-scripts/blob/master/src/papyrus_scripts/download.py) to learn more about the options available." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Let's specify the Papyrus version for the rest of the work\n", + "PAPYRUS_VERSION = \"05.5\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of files to be donwloaded: 6\n", + "Total size: 118MB\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "262b8dd13bf2485496146b0ac53fcc0d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Donwloading version 05.5: 0%| | 0.00/118M [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Define the set of receptors of interest with a label and their UniProt accession\n", + "adenosine_receptors = {\"A1\": \"P30542\", \"A2A\": \"P29274\", \"A2B\": \"P29275\", \"A3\": \"P0DMS8\"}\n", + "\n", + "# Filter the Papyrus bioactivity dataset and plot the distribution of activity values for the targets of interest\n", + "ar_dataset = filter_explore_activity_data(PAPYRUS_VERSION, adenosine_receptors)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "For PCM modeling, we keep from our bioactivity dataset three variables:\n", + "\n", + "* Bioactivity (`pchembl_value_mean`), which is our target variable to predict\n", + "* Target IDs (`accession`), which is the UniProt code to link the protein descriptors that we will calculate with ProDEC\n", + "* Compound IDs (`SMILES`), to link the compound descriptors that we will calculate with Mordred" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SMILESaccessionpchembl_value_Mean
222Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(...P292748.6800
223Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(...P305426.6800
383Nc1c(C(=O)Nc2ccc([N+](=O)[O-])cc2)sc2c1cc1CCCC...P292744.8200
462O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1P0DMS87.1515
464O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1P292745.6500
\n", + "
" + ], + "text/plain": [ + " SMILES accession \\\n", + "222 Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(... P29274 \n", + "223 Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(... P30542 \n", + "383 Nc1c(C(=O)Nc2ccc([N+](=O)[O-])cc2)sc2c1cc1CCCC... P29274 \n", + "462 O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1 P0DMS8 \n", + "464 O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1 P29274 \n", + "\n", + " pchembl_value_Mean \n", + "222 8.6800 \n", + "223 6.6800 \n", + "383 4.8200 \n", + "462 7.1515 \n", + "464 5.6500 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ar_dataset = ar_dataset[[\"SMILES\", \"accession\", \"pchembl_value_Mean\"]]\n", + "ar_dataset.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Align target sequences" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to ensure protein descriptors are of the same length, we first need to align the target sequences. We do this by creating an MSA with the software Clustal Omega (ClustalO). To begin with, we extract the protein sequences from the target files in Papyrus. The sequences could also be obtained from UniProt, but this way we ensure we are always retrieving the canonical isoform sequence.\n", + "Since Papyrus also contains bioactivity data for different mutants and species, the main protein identifier (`target_id` variable) consists of the UniProt accession code and the mutant ('WT' for wild type). Even though we are interested in the wild type, to map our targets of interest we calculate a new variable called `accession` to be consistent with the rest of the talktorial." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
target_idHGNC_symbolUniProtIDStatusOrganismClassificationLengthSequenceaccession
47P29275_WTADORA2BAA2BR_HUMANreviewedHomo sapiens (Human)Membrane receptor->Family A G protein-coupled ...332MLLETQDALYVALELVIAALSVAGNVLVCAAVGTANTLQTPTNYFL...P29275
80P30542_WTADORA1AA1R_HUMANreviewedHomo sapiens (Human)Membrane receptor->Family A G protein-coupled ...326MPPSISAFQAAYIGIEVLIALVSVPGNVLVIWAVKVNQALRDATFC...P30542
81P29274_WTADORA2AAA2AR_HUMANreviewedHomo sapiens (Human)Membrane receptor->Family A G protein-coupled ...412MPIMGSSVYITVELAIAVLAILGNVLVCWAVWLNSNLQNVTNYFVV...P29274
82P0DMS8_WTADORA3AA3R_HUMANreviewedHomo sapiens (Human)Membrane receptor->Family A G protein-coupled ...318MPNNSTALSLANVTYITMEIFIGLCAIVGNVLVICVVKLNPSLQTT...P0DMS8
\n", + "
" + ], + "text/plain": [ + " target_id HGNC_symbol UniProtID Status Organism \\\n", + "47 P29275_WT ADORA2B AA2BR_HUMAN reviewed Homo sapiens (Human) \n", + "80 P30542_WT ADORA1 AA1R_HUMAN reviewed Homo sapiens (Human) \n", + "81 P29274_WT ADORA2A AA2AR_HUMAN reviewed Homo sapiens (Human) \n", + "82 P0DMS8_WT ADORA3 AA3R_HUMAN reviewed Homo sapiens (Human) \n", + "\n", + " Classification Length \\\n", + "47 Membrane receptor->Family A G protein-coupled ... 332 \n", + "80 Membrane receptor->Family A G protein-coupled ... 326 \n", + "81 Membrane receptor->Family A G protein-coupled ... 412 \n", + "82 Membrane receptor->Family A G protein-coupled ... 318 \n", + "\n", + " Sequence accession \n", + "47 MLLETQDALYVALELVIAALSVAGNVLVCAAVGTANTLQTPTNYFL... P29275 \n", + "80 MPPSISAFQAAYIGIEVLIALVSVPGNVLVIWAVKVNQALRDATFC... P30542 \n", + "81 MPIMGSSVYITVELAIAVLAILGNVLVCWAVWLNSNLQNVTNYFVV... P29274 \n", + "82 MPNNSTALSLANVTYITMEIFIGLCAIVGNVLVICVVKLNPSLQTT... P0DMS8 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "protein_data = papyrus_scripts.read_protein_set(version=PAPYRUS_VERSION)\n", + "# Create new variable 'accession' with the UniProt accession codes by splitting target_id and keeping the first part\n", + "protein_data[\"accession\"] = protein_data[\"target_id\"].apply(lambda x: x.split(\"_\")[0])\n", + "# Filter protein data for our targets of interest based on accession code\n", + "targets = protein_data[protein_data.accession.isin(adenosine_receptors.values())]\n", + "targets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to align the sequences with ClustalO, we first need to write them into a FASTA file." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Create object with sequences and descriptions\n", + "records = []\n", + "for index, row in targets.reset_index(drop=True).iterrows():\n", + " records.append(\n", + " Bio_SeqIO.SeqRecord(\n", + " seq=Bio.Seq.Seq(row[\"Sequence\"]),\n", + " id=str(index),\n", + " name=row[\"accession\"],\n", + " description=\" \".join([row[\"UniProtID\"], row[\"Organism\"], row[\"Classification\"]]),\n", + " )\n", + " )\n", + "sequences_path = Path(DATA / \"sequences.fasta\")\n", + "# Write sequences as .fasta file\n", + "_ = Bio_SeqIO.write(records, sequences_path, \"fasta\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Now, we use ClustalO to align the sequences and write out the alignment file. We do this by calling the ClustalO webservice from the command line." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def align(entry_name):\n", + " \"\"\"\n", + " From the GPCRdb, get protein annotations associated with the input UniProt entry name.\n", + "\n", + " Parameters\n", + " ----------\n", + " entry_name : str\n", + " UniProt entry name for GPCR of interest.\n", + "\n", + " Returns\n", + " -------\n", + " dict\n", + " Protein annotations deposited in the GPCRdb.\n", + " \"\"\"\n", + "\n", + " url = f\"https://www.ebi.ac.uk/Tools/common/tools/help/index.html?tool=clustalo#!/Submit32job/post_run\"\n", + " url = f\"https://gpcrdb.org/services/protein/{entry_name}/\"\n", + " response = requests.get(url)\n", + " data = response.json()\n", + " return data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "\n", + "If you are running this notebook on your own data, please set your email address in the `MY_EMAIL` variable.\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Email (MY_EMAIL) was not set; use pre-calculated alignments.\n" + ] + } + ], + "source": [ + "%%bash -s \"$MY_EMAIL\"\n", + "# ClustalO service requires an email address\n", + "# If email was set, run ClustalO service, else use pre-calculated alignments\n", + "if [ $1 != \"None\" ]; then\n", + " echo \"Email (MY_EMAIL) was set to \"$1\n", + " # Query ClustalO webservice from command line\n", + " python scripts/clustalo.py --email $1 --stype protein --sequence data/sequences.fasta --outfmt fa --outdir data --outfile aligned_sequences --order input --pollFreq 20\n", + "else\n", + " echo \"Email (MY_EMAIL) was not set; use pre-calculated alignments.\"\n", + "fi" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Finally we parse the aligned sequences." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "alignment_file = Path(DATA / \"aligned_sequences.aln-fasta.fasta\")\n", + "aligned_sequences = [str(seq.seq) for seq in Bio.SeqIO.parse(alignment_file, \"fasta\")]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "And we visualize the MSA." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
╭────────────────────────────────────────── Multiple sequence alignment ──────────────────────────────────────────╮\n",
+       "│ 0 AA2BR_H…     1  -----MLLETQDALYVALELVIAALSVAGNVLVCAAVGTANTLQTPTNYFLVSLAAADVAVGLFAIPFAITISLGFCTDFYGCLFLACFVLV  │\n",
+       "│ 1 AA1R_HU…     1  ---MPPSISAFQAAYIGIEVLIALVSVPGNVLVIWAVKVNQALRDATFCFIVSLAVADVAVGALVIPLAILINIGPQTYFHTCLMVACPVLI  │\n",
+       "│ 2 AA2AR_H…     1  ------MPIMGSSVYITVELAIAVLAILGNVLVCWAVWLNSNLQNVTNYFVVSLAAADIAVGVLAIPFAITISTGFCAACHGCLFIACFVLV  │\n",
+       "│ 3 AA3R_HU…     1  MPNNSTALSLANVTYITMEIFIGLCAIVGNVLVICVVKLNPSLQTTTFYFIVSLALADIAVGVLVMPLAIVVSLGITIHFYSCLFMTCLLLI  │\n",
+       "│                                                                                                                 │\n",
+       "│ 0 AA2BR_H…    88  LTQSSIFSLLAVAVDRYLAICVPLRYKSLVTGTRARGVIAVLWVLAFGIGLTPFLGWNSKDSATNNCTEPWDGTTNESCC---LVKCLFENV  │\n",
+       "│ 1 AA1R_HU…    90  LTQSSILALLAIAVDRYLRVKIPLRYKMVVTPRRAAVAIAGCWILSFVVGLTPMFGWNNLSAVER----AWA---ANGSMGEPVIKCEFEKV  │\n",
+       "│ 2 AA2AR_H…    87  LTQSSIFSLLAIAIDRYIAIRIPLRYNGLVTGTRAKGIIAICWVLSFAIGLTPMLGWNN-------CGQPKEGKNHSQGCGEGQVACLFEDV  │\n",
+       "│ 3 AA3R_HU…    93  FTHASIMSLLAIAVDRYLRVKLTVRYKRVTTHRRIWLALGLCWLVSFLVGLTPMFGWNMKLTSEYH-------------RNVTFLSCQFVSV  │\n",
+       "│                                                                                                                 │\n",
+       "│ 0 AA2BR_H…   177  VPMSYMVYFNFFGCVLPPLLIMLVIYIKIFLVACRQLQRTEL----MDHSRTTLQREIHAAKSLAMIVGIFALCWLPVHAVNCVTLFQPAQG  │\n",
+       "│ 1 AA1R_HU…   175  ISMEYMVYFNFFVWVLPPLLLMVLIYLEVFYLIRKQLNKKVSAS--SGDPQKYYGKELKIAKSLALILFLFALSWLPLHILNCITLFCPSC-  │\n",
+       "│ 2 AA2AR_H…   172  VPMNYMVYFNFFACVLVPLLLMLGVYLRIFLAARRQLKQMESQPLPGERARSTLQKEVHAAKSLAIIVGLFALCWLPLHIINCFTFFCPDC-  │\n",
+       "│ 3 AA3R_HU…   172  MRMDYMVYFSFLTWIFIPLVVMCAIYLDIFYIIRNKLSLNLSN---SKETGAFYGREFKTAKSLFLVLFLFALSWLPLSIINCIIYFNG---  │\n",
+       "│                                                                                                                 │\n",
+       "│ 0 AA2BR_H…   265  KNKPKWAMNMAILLSHANSVVNPIVYAYRNRDFRYTFHKIISRYLLCQADVKSGNGQ----------AGVQPALGVGL--------------  │\n",
+       "│ 1 AA1R_HU…   264  -HKPSILTYIAIFLTHGNSAMNPIVYAFRIQKFRVTFLKIWNDHFRCQPAPPIDEDLPEE--------------------------------  │\n",
+       "│ 2 AA2AR_H…   263  SHAPLWLMYLAIVLSHTNSVVNPFIYAYRIREFRQTFRKIIRSHVLRQQEPFKAAGTSARVLAAHGSDGEQVSLRLNGHPPGVWANGSAPHP  │\n",
+       "│ 3 AA3R_HU…   258  -EVPQLVLYMGILLSHANSMMNPIVYAYKIKKFKETYLLILKACVVCHPSDSLDTSIEKNSE------------------------------  │\n",
+       "│                                                                                                                 │\n",
+       "│ 0 AA2BR_H…   333  ----------------------------------------------------------                                    │\n",
+       "│ 1 AA1R_HU…   323  --RPDD----------------------------------------------------                                    │\n",
+       "│ 2 AA2AR_H…   355  ERRPNGYALGLVSGGSAQESQGNTGLPDVELLSHELKGVCPEPPGLDDPLAQDGAGVS                                    │\n",
+       "│ 3 AA3R_HU…   319  ----------------------------------------------------------                                    │\n",
+       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
\n" + ], + "text/plain": [ + "╭────────────────────────────────────────── Multiple sequence alignment ──────────────────────────────────────────╮\n", + "│ 0 AA2BR_H… \u001b[1;36m 1\u001b[0m \u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m │\n", + "│ 1 AA1R_HU… \u001b[1;36m 1\u001b[0m \u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m │\n", + "│ 2 AA2AR_H… \u001b[1;36m 1\u001b[0m \u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m │\n", + "│ 3 AA3R_HU… \u001b[1;36m 1\u001b[0m \u001b[1;31mM\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m │\n", + "│ │\n", + "│ 0 AA2BR_H… \u001b[1;36m 88\u001b[0m \u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mV\u001b[0m │\n", + "│ 1 AA1R_HU… \u001b[1;36m 90\u001b[0m \u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mV\u001b[0m │\n", + "│ 2 AA2AR_H… \u001b[1;36m 87\u001b[0m \u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mV\u001b[0m │\n", + "│ 3 AA3R_HU… \u001b[1;36m 93\u001b[0m \u001b[1;31mF\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mV\u001b[0m │\n", + "│ │\n", + "│ 0 AA2BR_H… \u001b[1;36m177\u001b[0m \u001b[1;31mV\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mG\u001b[0m │\n", + "│ 1 AA1R_HU… \u001b[1;36m175\u001b[0m \u001b[1;31mI\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "│ 2 AA2AR_H… \u001b[1;36m172\u001b[0m \u001b[1;31mV\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "│ 3 AA3R_HU… \u001b[1;36m172\u001b[0m \u001b[1;31mM\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "│ │\n", + "│ 0 AA2BR_H… \u001b[1;36m265\u001b[0m \u001b[1;38;5;129mK\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "│ 1 AA1R_HU… \u001b[1;36m264\u001b[0m \u001b[1;38;5;239m-\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "│ 2 AA2AR_H… \u001b[1;36m263\u001b[0m \u001b[1;32mS\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mW\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mP\u001b[0m │\n", + "│ 3 AA3R_HU… \u001b[1;36m258\u001b[0m \u001b[1;38;5;239m-\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;31mM\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mF\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mI\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "│ │\n", + "│ 0 AA2BR_H… \u001b[1;36m333\u001b[0m \u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "│ 1 AA1R_HU… \u001b[1;36m323\u001b[0m \u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "│ 2 AA2AR_H… \u001b[1;36m355\u001b[0m \u001b[1;34mE\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;38;5;129mR\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mY\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;32mN\u001b[0m\u001b[1;32mT\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;32mS\u001b[0m\u001b[1;32mH\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;38;5;129mK\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mC\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;34mE\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;31mP\u001b[0m\u001b[1;31mL\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mQ\u001b[0m\u001b[1;34mD\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mA\u001b[0m\u001b[1;32mG\u001b[0m\u001b[1;31mV\u001b[0m\u001b[1;32mS\u001b[0m │\n", + "│ 3 AA3R_HU… \u001b[1;36m319\u001b[0m \u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m\u001b[1;38;5;239m-\u001b[0m │\n", + "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Read MSA\n", + "msa = Bio.AlignIO.read(alignment_file, \"fasta\")\n", + "viewer = rich_msa.RichAlignment(\n", + " names=[record.description for record in msa],\n", + " sequences=[str(record.seq) for record in msa],\n", + ")\n", + "# Visualize MSA\n", + "panel = rich.panel.Panel(viewer, title=\"Multiple sequence alignment\")\n", + "rich.print(panel)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "In the MSA we can observe that the adenosine A2A receptor has a longer C terminus than the rest of the adenosine receptors. Moreover, there are clear parts of the proteins that are very similar in all the receptors (i.e. transmembrane domains), and parts that vary in amino acid composition and length between receptors (i.e. mostly loops)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Calculate protein descriptors" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Now that our protein sequences are aligned, we can calculate protein descriptors using ProDEC. For that, let's parse all default descriptors available. Since we are focusing on Z-scale descriptors in this talktorial, we can explore the details about this descriptor, and in case we want some extra information we can look at the article where it is first described." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Available ProDEC descriptors: ['ADFQ', 'BLOSUM', 'c-scales', 'CBFQ', 'CDFQ', 'Combined descriptors', 'Contact energies', 'CUFQ', 'DPPS', 'E-scale', 'FASGAI', 'G-scales', 'GH-scale', 'GRID tscore', 'HESH', 'HPI', 'HSEHPCSV', 'Independent descriptors', 'ISA-ECI', 'Kidera', 'MS-WHIM', 'P-scale', 'PhysChem', 'ProtFP hash', 'ProtFP PCA', 'PSM', 'QCP', 'Raychaudhury', 'Sneath', 'SSIA AM1', 'SSIA DFT', 'SSIA HF', 'SSIA PM3', 'STscale', 'SVEEVA', 'SVGER', 'SVHEHS', 'SVMW', 'SVRDF', 'SVRG', 'SVWG', 'SZOTT', 'Tscale', 'V-scale', 'VARIMAX', 'VHSE', 'VHSEH', 'VSGETAWAY', 'VSTPV', 'VSTV', 'VSW', 'VTSA', 'Zscale binary', 'Zscale Hellberg', 'Zscale Jonsson', 'Zscale Sandberg', 'Zscale Sjöström', 'Zscale van Westen']\n" + ] + } + ], + "source": [ + "# Parse ProDEC descriptors\n", + "desc_factory = prodec.ProteinDescriptors()\n", + "# Print available descriptors\n", + "print(f\"Available ProDEC descriptors: {desc_factory.available_descriptors}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "More about Z-Scales:\n" + ] + }, + { + "data": { + "text/plain": [ + "{'Authors': 'Hellberg, Sjöström, Skagerberg, Wold',\n", + " 'Year': 1987,\n", + " 'Journal': 'Journal of Medicinal Chemistry',\n", + " 'DOI': '10.1021/jm00390a003',\n", + " 'PMID': None,\n", + " 'Patent': None}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Print information about Z-scales\n", + "print(\"More about Z-Scales:\")\n", + "desc_factory.get_descriptor(\"Zscale Hellberg\").Info" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def calculate_protein_descriptor(targets, aligned_sequences, protein_descriptor):\n", + " \"\"\"\n", + " Calculate protein descriptor of choice for aligned proteins of interest\n", + "\n", + " Parameters\n", + " ----------\n", + " targets : pandas.DataFrame\n", + " Pandas dataframe with information about targets of interest\n", + " aligned_sequences : list\n", + " List of aligned sequences read from fasta file produced with Clustal Omega\n", + " protein_descriptor : str\n", + " Protein descriptor label as described in ProDEC\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Dataset with accession and features for the protein descriptor of interest for the targets in the input\n", + " \"\"\"\n", + " # Get protein descriptor from ProDEC\n", + " prodec_descriptor = desc_factory.get_descriptor(protein_descriptor)\n", + "\n", + " # Calculate descriptor features for aligned sequences of interest\n", + " protein_features = prodec_descriptor.pandas_get(aligned_sequences)\n", + "\n", + " # Insert protein labels in the obtained features\n", + " protein_features.insert(0, \"accession\", targets.accession.reset_index(drop=True))\n", + "\n", + " return protein_features" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "315d66f818334fd9b3bc5ee912c42218", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/4 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
accessionZscale_1Zscale_2Zscale_3Zscale_4Zscale_5Zscale_6Zscale_7Zscale_8Zscale_9...Zscale_1269Zscale_1270Zscale_1271Zscale_1272Zscale_1273Zscale_1274Zscale_1275Zscale_1276Zscale_1277Zscale_1278
0P292750.000.000.000.000.000.000.000.000.00...0.000.000.000.00.000.000.000.000.000.00
1P305420.000.000.000.000.000.000.000.000.00...0.000.000.000.00.000.000.000.000.000.00
2P292740.000.000.000.000.000.000.000.000.00...0.092.23-5.360.3-2.69-2.53-1.291.96-1.630.57
3P0DMS8-2.49-0.27-0.41-1.220.882.233.221.450.84...0.000.000.000.00.000.000.000.000.000.00
\n", + "

4 rows × 1279 columns

\n", + "" + ], + "text/plain": [ + " accession Zscale_1 Zscale_2 Zscale_3 Zscale_4 Zscale_5 Zscale_6 \\\n", + "0 P29275 0.00 0.00 0.00 0.00 0.00 0.00 \n", + "1 P30542 0.00 0.00 0.00 0.00 0.00 0.00 \n", + "2 P29274 0.00 0.00 0.00 0.00 0.00 0.00 \n", + "3 P0DMS8 -2.49 -0.27 -0.41 -1.22 0.88 2.23 \n", + "\n", + " Zscale_7 Zscale_8 Zscale_9 ... Zscale_1269 Zscale_1270 Zscale_1271 \\\n", + "0 0.00 0.00 0.00 ... 0.00 0.00 0.00 \n", + "1 0.00 0.00 0.00 ... 0.00 0.00 0.00 \n", + "2 0.00 0.00 0.00 ... 0.09 2.23 -5.36 \n", + "3 3.22 1.45 0.84 ... 0.00 0.00 0.00 \n", + "\n", + " Zscale_1272 Zscale_1273 Zscale_1274 Zscale_1275 Zscale_1276 \\\n", + "0 0.0 0.00 0.00 0.00 0.00 \n", + "1 0.0 0.00 0.00 0.00 0.00 \n", + "2 0.3 -2.69 -2.53 -1.29 1.96 \n", + "3 0.0 0.00 0.00 0.00 0.00 \n", + "\n", + " Zscale_1277 Zscale_1278 \n", + "0 0.00 0.00 \n", + "1 0.00 0.00 \n", + "2 -1.63 0.57 \n", + "3 0.00 0.00 \n", + "\n", + "[4 rows x 1279 columns]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "protein_features = calculate_protein_descriptor(targets, aligned_sequences, \"Zscale Hellberg\")\n", + "protein_features" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Calculate compound descriptors" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "The final step to prepare our dataset for PCM is to calculate compound descriptors. For this, we first have to convert the molecules in our dataset to chemical entities from their text representation (SMILES). Afterwards, we use Mordred to calculate 2D molecular descriptors." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def calculate_molecular_descriptors(bioactivity_dataset, user_descriptors):\n", + " \"\"\"\n", + " Calculate compound molecular descriptors of choice for unique molecules in the bioactivity dataset\n", + "\n", + " Parameters\n", + " ----------\n", + " bioactivity_dataset : pandas.DataFrame\n", + " Pandas dataframe with bioactivity dataset for PCM\n", + " user_descriptors : list\n", + " List of descriptors from Mordred to calculate\n", + " Use ['all'] for calculate all possible descriptors\n", + "\n", + " Returns\n", + " -------\n", + " pandas.DataFrame\n", + " Dataset with SMILES and features for the compound descriptors of interest for molecules in the bioactivity dataset\n", + " \"\"\"\n", + " # Extract unique molecules from the bioactivity dataset\n", + " molecules = [Chem.MolFromSmiles(x) for x in bioactivity_dataset[\"SMILES\"].unique()]\n", + "\n", + " # Use Mordred to calculate molecular descriptors of interest\n", + " if user_descriptors == [\"all\"]:\n", + " mordred_calculator = mordred.Calculator(mordred.descriptors, ignore_3D=True)\n", + " molecular_descriptor = mordred_calculator.pandas(molecules, pynb=False)\n", + "\n", + " else:\n", + " mordred_list = [\n", + " mordred_descriptors.__dict__[descriptor] for descriptor in user_descriptors\n", + " ]\n", + " mordred_calculator = mordred.Calculator(mordred_list, ignore_3D=True)\n", + " molecular_descriptor = mordred_calculator.pandas(molecules, ipynb=False)\n", + "\n", + " # Clean descriptors step 1: replace mordred format to pandas format\n", + " molecular_descriptor = pd.DataFrame(molecular_descriptor.fill_missing(np.NAN))\n", + "\n", + " # Clean descriptors step 2: replace ambiguous names (relevant for writing and reading to/from a file)\n", + " mordred_descs_names = {}\n", + " for desc_name in mordred_calculator.descriptors:\n", + " # First we replace the ambiguous names with aliphatic rings\n", + " mordred_descs_names[str(desc_name)] = re.sub(\n", + " r\"(.*F?)A(H?Ring)$\", r\"\\1aliph\\2\", str(desc_name)\n", + " )\n", + " # Then we replace the ambiguous names with aromatic rings\n", + " mordred_descs_names[str(desc_name)] = re.sub(\n", + " r\"(.*F?)a(H?Ring)$\", r\"\\1arom\\2\", mordred_descs_names[str(desc_name)]\n", + " )\n", + "\n", + " molecular_descriptor = molecular_descriptor.rename(mordred_descs_names)\n", + "\n", + " # Clean descriptors step 3: remove absurdly big and small values (e.g. topological indexes of molecules containing fragments)\n", + " molecular_descriptor = molecular_descriptor.astype(np.float32).replace(\n", + " [np.inf, -np.inf], np.NAN\n", + " )\n", + " molecular_descriptor = molecular_descriptor.fillna(value=0)\n", + "\n", + " # Clean descriptors step 4: round values to 3 decimals to reduce memory footprint\n", + " molecular_descriptor = molecular_descriptor.astype(float).round(3)\n", + " molecular_descriptor = molecular_descriptor.convert_dtypes()\n", + "\n", + " # Insert SMILES in first column for mapping\n", + " molecular_descriptor.insert(0, \"SMILES\", bioactivity_dataset.SMILES.unique())\n", + "\n", + " return molecular_descriptor" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████| 6898/6898 [00:09<00:00, 741.92it/s]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SMILESABCABCGGnAcidnBasenAtomnHeavyAtomnSpironBridgeheadnHetero...nNnOnSnPnFnClnBrnInXBalabanJ
0Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(...21.04117.684015127008...6200000001.631
1Nc1c(C(=O)Nc2ccc([N+](=O)[O-])cc2)sc2c1cc1CCCC...20.70115.635004226008...4310000001.307
2O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc123.2317.456004329008...6200000001.328
3CCNC(=O)C1OC(n2cnc3c2ncnc3Nc2ccc(OCC(=O)Nc3ccc...31.33622.2130066400014...7600010011.043
4NC(=NC(=O)Cn1c(O)c2CCCCc2c1O)Nc1nc2c(cccc2)s121.40817.066034627009...5310000001.234
\n", + "

5 rows × 23 columns

\n", + "
" + ], + "text/plain": [ + " SMILES ABC ABCGG nAcid \\\n", + "0 Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(... 21.041 17.684 0 \n", + "1 Nc1c(C(=O)Nc2ccc([N+](=O)[O-])cc2)sc2c1cc1CCCC... 20.701 15.635 0 \n", + "2 O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1 23.23 17.456 0 \n", + "3 CCNC(=O)C1OC(n2cnc3c2ncnc3Nc2ccc(OCC(=O)Nc3ccc... 31.336 22.213 0 \n", + "4 NC(=NC(=O)Cn1c(O)c2CCCCc2c1O)Nc1nc2c(cccc2)s1 21.408 17.066 0 \n", + "\n", + " nBase nAtom nHeavyAtom nSpiro nBridgehead nHetero ... nN nO nS \\\n", + "0 1 51 27 0 0 8 ... 6 2 0 \n", + "1 0 42 26 0 0 8 ... 4 3 1 \n", + "2 0 43 29 0 0 8 ... 6 2 0 \n", + "3 0 66 40 0 0 14 ... 7 6 0 \n", + "4 3 46 27 0 0 9 ... 5 3 1 \n", + "\n", + " nP nF nCl nBr nI nX BalabanJ \n", + "0 0 0 0 0 0 0 1.631 \n", + "1 0 0 0 0 0 0 1.307 \n", + "2 0 0 0 0 0 0 1.328 \n", + "3 0 0 1 0 0 1 1.043 \n", + "4 0 0 0 0 0 0 1.234 \n", + "\n", + "[5 rows x 23 columns]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "molecular_features = calculate_molecular_descriptors(\n", + " ar_dataset, [\"ABCIndex\", \"AcidBase\", \"AtomCount\", \"BalabanJ\"]\n", + ")\n", + "molecular_features.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "### Proteochemometrics modeling" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "When our dataset is complete with all the descriptors for proteins and compounds, we can start with the modeling part. Here, we will use a Random Forest (RF) ML regression model to predict the bioactivity of our compound-target pairs.\n", + "\n", + "We will try two methods to split our dataset between training and test set:\n", + "\n", + "* Random split\n", + "* Leave one target out (LOTO) split\n", + "\n", + "Additionally, we will compare our PCM model to four independent models trained only on compound data (QSAR), and finally we will comment on the results.\n", + "\n", + "Ultimately, we want a model that can predict compound activity data towards a target of interest for compound-target pairs that it has never seen before. By combining several targets in one model, we expect the model to be able to learn the similarities and differences between targets and use the additional data to make better predictions.\n", + "\n", + "We start by defining a few functions that will help us split the data (`split_train_test`) and train and validate a PCM regression model (`train_validate_pcm_model`). The validation will be done on the test set and the performance will be assessed using regression metrics such as Person's $r$, $R^{2}$ and $MAE$. This function will also plot the correlation between true and predicted values, making a distinction between the different targets in the test set to assess whether the PCM model has a different performance per protein. Finally, we will define a function (`train_validate_qsar_model`) to train a QSAR model for a single target based on a random split. The output of this function will be comparable to that of the PCM model for comparison purposes." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Helper functions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Function to split the data using one of these two methods described in theory: random split or leave one target out (LOTO) split." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def split_train_test(\n", + " pcm_dataset, test_size, split_method, loto_target=None, loto_accession=\"None\"\n", + "):\n", + " \"\"\"\n", + " Split a dataset for PCM modeling in train and test set based on the split method of choice\n", + "\n", + " Parameters\n", + " ----------\n", + " pcm_dataset : pandas.DataFrame\n", + " Pandas dataframe with bioactivity dataset for PCM including compound and protein descriptors\n", + " test_size : float\n", + " Ratio of the data to include in the test set\n", + " split_method : str\n", + " 'random' for random split\n", + " 'loto' for leave one target out split\n", + " loto_target : str\n", + " Target label to leave out for testing in 'loto' split method\n", + " loto_accession : str\n", + " Target UniProt accession to leave out for testing in 'loto' split method\n", + "\n", + " Returns\n", + " -------\n", + " train: pandas.DataFrame\n", + " Training dataset\n", + " test : pandas.DataFrame\n", + " Testing dataset\n", + " \"\"\"\n", + " # Random split\n", + " if split_method == \"random\":\n", + " train, test = train_test_split(pcm_dataset, test_size=test_size, random_state=1234)\n", + "\n", + " # Leave one target out\n", + " elif split_method == \"loto\":\n", + " if loto_accession != None:\n", + " # Leave out defined accession\n", + " test_target = loto_accession\n", + " print(f\"Target left out for testing is {loto_target}\")\n", + " else:\n", + " raise ValueError(\"loto_accession needs to be defined\")\n", + "\n", + " # Move data associated with target to test set and rest to training set\n", + " train = pcm_dataset[pcm_dataset[\"accession\"] != test_target]\n", + " test = pcm_dataset[pcm_dataset[\"accession\"] == test_target]\n", + "\n", + " else:\n", + " raise ValueError(f\"Split method {split_method} undefined; use random or loto.\")\n", + "\n", + " # Print statistics of training and test sets\n", + " print(f\"Training set has {train.shape[0]} datapoints\")\n", + " print(\n", + " f\"Test set has {test.shape[0]} datapoints ({round(100*test.shape[0]/pcm_dataset.shape[0], 3)} %)\"\n", + " )\n", + "\n", + " return train, test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Function to report performance metrics for a regression model based on the true and predicted values of the target variable." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def _performance_metrics(y_true, y_predicted):\n", + " \"\"\"\n", + " Calculate regression performance metrics\n", + "\n", + " Parameters\n", + " ----------\n", + " y_true: pandas.Series\n", + " True values of the target variable\n", + " y_predicted: list\n", + " Predicted values of the target variable\n", + "\n", + " Returns\n", + " -------\n", + " dict:\n", + " Pearson's r, R2 score and MAE on test set\n", + " \"\"\"\n", + " model_performance = {}\n", + " model_performance[\"Pearson r\"] = pearsonr(y_true, y_predicted)[0]\n", + " model_performance[\"R2 score\"] = r2_score(y_true, y_predicted)\n", + " model_performance[\"MAE\"] = mean_absolute_error(y_true, y_predicted)\n", + "\n", + " print(json.dumps(model_performance, indent=4))\n", + "\n", + " return model_performance" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Function to plot the goodness of fit of true and predicted values for a regression model." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def _performance_plot(target, y_true, y_predicted, r2_score):\n", + " \"\"\"\n", + " Plot fit of true values vs. predicted values for the target variable\n", + "\n", + " Parameters\n", + " ----------\n", + " target: str\n", + " Protein target to generate plot for\n", + " y_true: pandas.Series\n", + " True values of the target variable\n", + " y_predicted: list\n", + " Predicted values of the target variable\n", + " r2_score: float\n", + " R2 score value to add to plot legend's\n", + "\n", + " Returns\n", + " -------\n", + " fig:\n", + " Figure with true vs. predicted values colored by target, with r2_score calculated per target\n", + " \"\"\"\n", + " ax = sns.scatterplot(y=y_true, x=y_predicted, label=(f\"{target} R2 = {r2_score:.2f}\"))\n", + " _ = sns.lineplot(x=(0, 14), y=(0, 14))\n", + " _ = ax.set_xlim((0, 14))\n", + " _ = ax.set_ylim((0, 14))\n", + " _ = ax.set_xlabel(\"Predicted\")\n", + " _ = ax.set_ylabel(\"Observed\")\n", + "\n", + " return ax" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Function to train a PCM RF model on a training set and validate it on a test set. Performance metrics are calculated for the whole test set, and also separately." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def train_validate_pcm_model(targets_dict, train, test):\n", + " \"\"\"\n", + " Train PCM RF regression model and validate on test set, calculating performance metrics\n", + "\n", + " Parameters\n", + " ----------\n", + " targets_dict: dict\n", + " Dictionary of target labels and accession codes in the PCM set\n", + " train: pandas.DataFrame\n", + " Training dataset\n", + " test : pandas.DataFrame\n", + " Testing dataset\n", + "\n", + " Returns\n", + " -------\n", + " dict:\n", + " Pearson's r, R2 score and MAE on test set\n", + " fig:\n", + " Figure with true vs. predicted values colored by target, with r2_score calculated per target\n", + " \"\"\"\n", + " # Store compound-target pairs in test set to allow comparative performance evaluation\n", + " test_pairs = test[[\"SMILES\", \"accession\", \"pchembl_value_Mean\"]].reset_index(drop=True)\n", + "\n", + " # Remove identifiers\n", + " train = train.drop(columns=[\"SMILES\", \"accession\"])\n", + " test = test.drop(columns=[\"SMILES\", \"accession\"])\n", + "\n", + " # Set model parameter for random forest\n", + " param = {\n", + " \"n_estimators\": 100, # number of trees to grows\n", + " \"criterion\": \"squared_error\", # cost function to be optimized for a split\n", + " }\n", + " model_rf = RandomForestRegressor(**param)\n", + "\n", + " # Fit model\n", + " model_rf.fit(train.iloc[:, 1:], train.iloc[:, 0])\n", + "\n", + " # Make predictions on test set\n", + " predictions = model_rf.predict(test.iloc[:, 1:])\n", + "\n", + " # Calculate model performance with regression metrics\n", + " print(\"=== PCM model performance ===\")\n", + " model_performance = _performance_metrics(test.iloc[:, 0], predictions)\n", + "\n", + " # Add column named 'Target' for easier data visualization\n", + " _targets_dict_reversed = {uniprot: target for target, uniprot in targets_dict.items()}\n", + " test_pairs[\"Target\"] = test_pairs[\"accession\"].apply(lambda x: _targets_dict_reversed[x])\n", + "\n", + " # Calculate model performance per target\n", + " test_pairs[\"prediction\"] = predictions\n", + "\n", + " for target, accession in targets_dict.items():\n", + " # Define true values and predictions per target\n", + " true_target = test_pairs[test_pairs[\"accession\"] == accession][\"pchembl_value_Mean\"]\n", + " prediction_target = test_pairs[test_pairs[\"accession\"] == accession][\"prediction\"]\n", + "\n", + " try:\n", + " # Calculate r2 score\n", + " r2_target = r2_score(true_target, prediction_target)\n", + "\n", + " # Plot correlation between true and predicted values\n", + " _performance_plot(target, true_target, prediction_target, r2_target)\n", + "\n", + " except ValueError:\n", + " print(\n", + " f\"Not plotting {target}. Performance can only be plotted for the left out target in LOTO split\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Function to split a QSAR dataset randomly and train and validate a RF QSAR model for a target of interest." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def train_validate_qsar_model(qsar_dataset, target, accession, test_size):\n", + " \"\"\"\n", + " Train PCM RF regression model and validate on test set, calculating performance metrics\n", + "\n", + " Parameters\n", + " ----------\n", + " qsar_dataset : pandas.DataFrame\n", + " Pandas dataframe with bioactivity dataset for QSAR including compound descriptors\n", + " target : str\n", + " Target label for QSAR model\n", + " accession: str\n", + " Target UniProt accession for QSAR model\n", + " test_size: float\n", + " Ratio of the data to include in the test set upon random split\n", + "\n", + " Returns\n", + " -------\n", + " dict:\n", + " Pearson's r, R2 score and MAE on test set\n", + " fig:\n", + " Figure with true vs. predicted values, with r2_score calculated\n", + " \"\"\"\n", + " # Extract target-specific dataset\n", + " target_dataset = qsar_dataset[qsar_dataset[\"accession\"] == accession]\n", + "\n", + " # Remove identifiers\n", + " target_dataset = target_dataset.drop(columns=[\"SMILES\", \"accession\"])\n", + "\n", + " # Random-split in training and test set\n", + " train, test = train_test_split(target_dataset, test_size=test_size, random_state=1234)\n", + "\n", + " # Set model parameter for random forest\n", + " param = {\n", + " \"n_estimators\": 100, # number of trees to grows\n", + " \"criterion\": \"squared_error\", # cost function to be optimized for a split\n", + " }\n", + " model_rf = RandomForestRegressor(**param)\n", + "\n", + " # Fit model\n", + " model_rf.fit(train.iloc[:, 1:], train.iloc[:, 0])\n", + "\n", + " # Make predictions on test set\n", + " predictions = model_rf.predict(test.iloc[:, 1:])\n", + "\n", + " # Calculate model performance with regression metrics\n", + " print(f\"=== QSAR model performance {target} ===\")\n", + " model_performance = _performance_metrics(test.iloc[:, 0], predictions)\n", + "\n", + " # Plot correlation between true and predicted values\n", + " _performance_plot(target, test.iloc[:, 0], predictions, model_performance[\"R2 score\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Preprocessing" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "For each compound-target pair in our bioactivity dataset, we need to add the protein and molecular features previously calculated. We join the protein features based on UniProt accession and the molecular features based on SMILES." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SMILESaccessionpchembl_value_MeanZscale_1Zscale_2Zscale_3Zscale_4Zscale_5Zscale_6Zscale_7...nNnOnSnPnFnClnBrnInXBalabanJ
0Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(...P292748.68000.000.000.000.000.000.000.00...6200000001.631
1Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(...P305426.68000.000.000.000.000.000.000.00...6200000001.631
2Nc1c(C(=O)Nc2ccc([N+](=O)[O-])cc2)sc2c1cc1CCCC...P292744.82000.000.000.000.000.000.000.00...4310000001.307
3O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1P292745.65000.000.000.000.000.000.000.00...6200000001.328
4O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1P0DMS87.1515-2.49-0.27-0.41-1.220.882.233.22...6200000001.328
\n", + "

5 rows × 1303 columns

\n", + "
" + ], + "text/plain": [ + " SMILES accession \\\n", + "0 Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(... P29274 \n", + "1 Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(... P30542 \n", + "2 Nc1c(C(=O)Nc2ccc([N+](=O)[O-])cc2)sc2c1cc1CCCC... P29274 \n", + "3 O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1 P29274 \n", + "4 O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1 P0DMS8 \n", + "\n", + " pchembl_value_Mean Zscale_1 Zscale_2 Zscale_3 Zscale_4 Zscale_5 \\\n", + "0 8.6800 0.00 0.00 0.00 0.00 0.00 \n", + "1 6.6800 0.00 0.00 0.00 0.00 0.00 \n", + "2 4.8200 0.00 0.00 0.00 0.00 0.00 \n", + "3 5.6500 0.00 0.00 0.00 0.00 0.00 \n", + "4 7.1515 -2.49 -0.27 -0.41 -1.22 0.88 \n", + "\n", + " Zscale_6 Zscale_7 ... nN nO nS nP nF nCl nBr nI nX BalabanJ \n", + "0 0.00 0.00 ... 6 2 0 0 0 0 0 0 0 1.631 \n", + "1 0.00 0.00 ... 6 2 0 0 0 0 0 0 0 1.631 \n", + "2 0.00 0.00 ... 4 3 1 0 0 0 0 0 0 1.307 \n", + "3 0.00 0.00 ... 6 2 0 0 0 0 0 0 0 1.328 \n", + "4 2.23 3.22 ... 6 2 0 0 0 0 0 0 0 1.328 \n", + "\n", + "[5 rows x 1303 columns]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Add protein and molecular features to bioactivity dataset to generate PCM dataset\n", + "ar_pcm_dataset = ar_dataset.merge(protein_features, on=\"accession\")\n", + "ar_pcm_dataset = ar_pcm_dataset.merge(molecular_features, on=\"SMILES\")\n", + "\n", + "ar_pcm_dataset.head()\n", + "# NBVAL_CHECK_OUTPUT" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "For QSAR modeling, we do the same but we do not include the protein descriptors. This results on a dataset for modeling with a significantly reduced number of features." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SMILESaccessionpchembl_value_MeanABCABCGGnAcidnBasenAtomnHeavyAtomnSpiro...nNnOnSnPnFnClnBrnInXBalabanJ
0Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(...P292748.680021.04117.6840151270...6200000001.631
1Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(...P305426.680021.04117.6840151270...6200000001.631
2Nc1c(C(=O)Nc2ccc([N+](=O)[O-])cc2)sc2c1cc1CCCC...P292744.820020.70115.6350042260...4310000001.307
3O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1P0DMS87.151523.2317.4560043290...6200000001.328
4O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1P292745.650023.2317.4560043290...6200000001.328
\n", + "

5 rows × 25 columns

\n", + "
" + ], + "text/plain": [ + " SMILES accession \\\n", + "0 Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(... P29274 \n", + "1 Cc1nn(-c2cc(NC(=O)CCN(C)C)nc(-c3ccc(C)o3)n2)c(... P30542 \n", + "2 Nc1c(C(=O)Nc2ccc([N+](=O)[O-])cc2)sc2c1cc1CCCC... P29274 \n", + "3 O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1 P0DMS8 \n", + "4 O=C(Nc1nc2ncccc2n2c(=O)n(-c3ccccc3)nc12)c1ccccc1 P29274 \n", + "\n", + " pchembl_value_Mean ABC ABCGG nAcid nBase nAtom nHeavyAtom \\\n", + "0 8.6800 21.041 17.684 0 1 51 27 \n", + "1 6.6800 21.041 17.684 0 1 51 27 \n", + "2 4.8200 20.701 15.635 0 0 42 26 \n", + "3 7.1515 23.23 17.456 0 0 43 29 \n", + "4 5.6500 23.23 17.456 0 0 43 29 \n", + "\n", + " nSpiro ... nN nO nS nP nF nCl nBr nI nX BalabanJ \n", + "0 0 ... 6 2 0 0 0 0 0 0 0 1.631 \n", + "1 0 ... 6 2 0 0 0 0 0 0 0 1.631 \n", + "2 0 ... 4 3 1 0 0 0 0 0 0 1.307 \n", + "3 0 ... 6 2 0 0 0 0 0 0 0 1.328 \n", + "4 0 ... 6 2 0 0 0 0 0 0 0 1.328 \n", + "\n", + "[5 rows x 25 columns]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Add molecular features to bioactivity dataset to generate QSAR dataset\n", + "ar_qsar_dataset = ar_dataset.merge(molecular_features, on=\"SMILES\")\n", + "\n", + "ar_qsar_dataset.head()\n", + "# NBVAL_CHECK_OUTPUT" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### Model training and validation" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "##### Random split PCM model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "The first PCM model that we train for the four adenosine receptors is based on a random split, where 20 % of the data (2,544 datapoints) is part of the test set for validation." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "== Random split ==\n", + "Training set has 10175 datapoints\n", + "Test set has 2544 datapoints (20.002 %)\n" + ] + } + ], + "source": [ + "# Split dataset in training and test set (random split)\n", + "print(\"== Random split ==\")\n", + "train_random, test_random = split_train_test(ar_pcm_dataset, 0.20, \"random\")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== PCM model performance ===\n", + "{\n", + " \"Pearson r\": 0.6921704181980155,\n", + " \"R2 score\": 0.4729408196152224,\n", + " \"MAE\": 0.6373598241125418\n", + "}\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Train and validate PCM model\n", + "train_validate_pcm_model(adenosine_receptors, train_random, test_random)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Based on the performance metrics of the PCM model, Pearson's $r$ tells us that the true and predicted values are highly correlated. Moreover, the $R^{2}$ tells us that almost 50 % of the variance of the target variable is explained by the model features and that the model is predictive. The $MAE$ tells us that the predictions are on average 0.64 p-value units off, which is an acceptable prediction error.\n", + "An interesting observation is that the $R^{2}$ score is quite similar if we calculate it independently for the test set datapoint corresponding to each target." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Random split QSAR models" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Now, we want to compare the use of a single PCM model for four targets vs. four independent QSAR models trained for each target solely on chemical compound features." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== QSAR model performance A1 ===\n", + "{\n", + " \"Pearson r\": 0.5986860794442124,\n", + " \"R2 score\": 0.35708264748315865,\n", + " \"MAE\": 0.5975955476925413\n", + "}\n", + "=== QSAR model performance A2A ===\n", + "{\n", + " \"Pearson r\": 0.6331428179843668,\n", + " \"R2 score\": 0.3984324237653284,\n", + " \"MAE\": 0.6998201581163358\n", + "}\n", + "=== QSAR model performance A2B ===\n", + "{\n", + " \"Pearson r\": 0.7006823641193349,\n", + " \"R2 score\": 0.4803217299541849,\n", + " \"MAE\": 0.5573997234421912\n", + "}\n", + "=== QSAR model performance A3 ===\n", + "{\n", + " \"Pearson r\": 0.6643990005833391,\n", + " \"R2 score\": 0.43854963831859717,\n", + " \"MAE\": 0.6908388511158647\n", + "}\n" + ] + }, + { + "data": { + "image/png": "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LisrSwKkXbt22Y7l5eVJgPTzzz87fV5N/fkSBOHm9PP7K6Vd97SUjrRoKR1q1VL68Jlekqm4uLaHddNw9fP7WtVqzk737t2RXDRdd3XuRpFRmMHChIUkpCfYjkWHRbMoahGhnqHX7b1bt26lRYsWtGjRgpiYGCZNmsSCBQsqnJUA69Z9f3//Cs9LksQPP/zAuXPn6Ny581WPRafT8fbbbwPg5ubm8rri4mKXYzh79ix33nmny/fFxMSwefNmp+cSExNp06YNYWFhtmP3338/BoOB/fv306NHjwrHNnz4cDZu3EhoqON/t4CAAFq1asWWLVu46667UKlU/O9//yMkJISOHTu6HK8gCLcXs8nEtmkDaP3zWZQWuOQDugkjGD56fm0P7bZ1wyco38i0Bq1DoAMQnx7PooRFrOy2El+V73V5d1xcHDExMQD069ePgoICduzYQe/ezsuKJyYm8sknn/DNN984nKtXrx5grVFksVhYvHgx3bpVXtCq5D6dTockSXTs2JFevXpVeP3s2bMJDw+vcIwAYWFhtmXNirhKUs/IyCAkJMTumJ+fH+7u7i6Xm6ZOnUpUVBQPP/yw0/MymYyffvqJhx9+GG9vb+RyOSEhIXz//fcu6z4JgnB7OXs8mQNTY4g4YQLgaDMld617nwbNI2p5ZLc3EexUQ05RjkOgUyI+PZ6copzrEuwcPXqUP/74g88++wwApVLJsGHDeOutt5wGEikpKTz88MM8//zz9OnTx+H877//jre3NwaDgT/++IOJEyfi7+/P+PHjXY7j999/x9PTk4MHDzJr1izeeeedCmd2Vq1axUcffcTOnTvx8PCo8JlKpZJmzZq5fG9lnM1uSZJU4azXV199xS+//MLBgwcrfKYkSUyYMIHg4GB+//131Go1b775Jg8++CB//vkndevWrdaYBUG4+f34zlI0r31AizwoVkBK74YMXfM1CqX4UVvbxH+Basg35lfrfFXFxcVhMpkIDw+3HZMkCTc3N3Jzc/Hz87MdP3LkCD179uSpp55i/nznU6iNGze2zU60bt2avXv3smzZskqDnZL77rjjDoqKinj00Uf566+/HLb+r169muXLl/Pzzz/Trl07l8+s7jJWaGgoe/futTuWm5tLcXGxw4xPiV9++YWTJ086zNAMGjSIe++9l507d/LLL7/w9ddfk5uba5tZeu21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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Iterate over targets (adenosine receptors)\n", + "for target, accession in adenosine_receptors.items():\n", + " # Train and validate QSAR models\n", + " train_validate_qsar_model(ar_qsar_dataset, target, accession, 0.20)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "The four QSAR models trained have quite good performance, with high correlation between the observed and predicted values. Compared to the PCM model, the $R^{2}$ score is less homogeneous between targets and, in general, lower. These results seem to indicate that the PCM model is able to extrapolate certain properties between targets." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Leave one target out split PCM model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The random split PCM model works pretty well. However, a model trained and validated on a random split might overestimate the performance compared to a real life drug discovery scenario since some compounds can be tested in several targets.\n", + "Finally, to test whether our PCM model could be used to predict bioactivity data on a target for which we have no previously known bioactivity data, we can train and validate PCM models following the \"leave one target out\" (LOTO) split method. We can do this process for each of the adenosine receptors." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "== Leave one target out split ==\n", + "Target left out for testing is A1\n", + "Training set has 9200 datapoints\n", + "Test set has 3519 datapoints (27.667 %)\n", + "=== PCM model performance ===\n", + "{\n", + " \"Pearson r\": 0.2577150000359349,\n", + " \"R2 score\": -0.09531568827653203,\n", + " \"MAE\": 0.8537743338477594\n", + "}\n", + "Not plotting A2A. Performance can only be plotted for the left out target in LOTO split\n", + "Not plotting A2B. Performance can only be plotted for the left out target in LOTO split\n", + "Not plotting A3. Performance can only be plotted for the left out target in LOTO split\n", + "== Leave one target out split ==\n", + "Target left out for testing is A2A\n", + "Training set has 8728 datapoints\n", + "Test set has 3991 datapoints (31.378 %)\n", + "=== PCM model performance ===\n", + "{\n", + " \"Pearson r\": 0.21008560538267065,\n", + " \"R2 score\": -0.042261684276110545,\n", + " \"MAE\": 0.9620344947955969\n", + "}\n", + "Not plotting A1. Performance can only be plotted for the left out target in LOTO split\n", + "Not plotting A2B. Performance can only be plotted for the left out target in LOTO split\n", + "Not plotting A3. Performance can only be plotted for the left out target in LOTO split\n", + "== Leave one target out split ==\n", + "Target left out for testing is A2B\n", + "Training set has 10731 datapoints\n", + "Test set has 1988 datapoints (15.63 %)\n", + "=== PCM model performance ===\n", + "{\n", + " \"Pearson r\": 0.0032209100786820756,\n", + " \"R2 score\": -0.2650510712411036,\n", + " \"MAE\": 0.9803939410025996\n", + "}\n", + "Not plotting A1. Performance can only be plotted for the left out target in LOTO split\n", + "Not plotting A2A. Performance can only be plotted for the left out target in LOTO split\n", + "Not plotting A3. Performance can only be plotted for the left out target in LOTO split\n", + "== Leave one target out split ==\n", + "Target left out for testing is A3\n", + "Training set has 9498 datapoints\n", + "Test set has 3221 datapoints (25.324 %)\n", + "=== PCM model performance ===\n", + "{\n", + " \"Pearson r\": 0.10347100605749118,\n", + " \"R2 score\": -0.2670385587615447,\n", + " \"MAE\": 1.05459014925041\n", + "}\n", + "Not plotting A1. Performance can only be plotted for the left out target in LOTO split\n", + "Not plotting A2A. Performance can only be plotted for the left out target in LOTO split\n", + "Not plotting A2B. Performance can only be plotted for the left out target in LOTO split\n" + ] + }, + { + "data": { + "image/png": "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OXOIjIwkICCAgQMHUlFR4fJ4zW0sm83G3Llzufzyy9FqtcTFxTFr1izAMXUboGPHjigUCrp37+583YoVK2jVqhW+vr60bNmSpUuXurzPxo0b6dixI76+vnTp0oWtW7fW4ycnhDjXZGVHCHFO6HQ6zGYzAP/88w8ff/wxn376KSqVCoC77rqL0NBQvv32W4KCgnj99de56aab2Lt3L6GhoXz88cdMmTKF1157jeuuu453332XxYsX07x581rfc/z48bzxxhssWrSIrl27cvToUXbv3g04Eparr76aH3/8kTZt2jgnSb/xxhtMmTKFJUuW0LFjR7Zu3cqTTz6Jn58fjz76KOXl5dx9993ceOONvPfee+zfv5/hw4ef409PCFGvznJYqRBC2B999FH7fffd57z9xx9/2MPCwuy9evWyT5kyxe7j42PPzc11Pr527Vp7YGCgvaKiwuU6l112mf3111+32+12e2Jion3w4MEuj19zzTX2hIQEj+9bUlJi12q19jfeeMNjjFWTpbdu3epyf5MmTewffPCBy30zZsywJyYm2u12u/3111+3h4aG2svLy52PL1u2zOO1hBANk2xjCSHqxddff42/vz++vr4kJibSrVs3Xn31VQDi4+Np1KiR87mbN2+mrKyMsLAw/P39nX/t37+ff//9F4C//vqLxMREl/eoebu6v/76C5PJxE033XTKMefl5XH48GEGDhzoEsfMmTNd4khISECv159SHEKIhke2sYQQ9eKGG25g2bJl+Pj4EB0d7VKE7Ofn5/Jcm81G48aN+eWXX9yuExwcfEbvr9PpTvs1NpsNcGxlXXPNNS6PVW232e32M4pHCNFwSLIjhKgXfn5+XH755af03E6dOpGdnY1araZp06Yen9OqVSs2bNhASkqK874NGzbUes0WLVqg0+lYu3YtTzzxhNvjVTU6VqvVeV9kZCQxMTHs27ePvn37erxu69ateffddzEajc6Eqq44hBANj2xjCSHOu5tvvpnExETuv/9+fvjhBw4cOEB6ejoTJ07kf//7HwDDhw/nrbfe4q233mLv3r1MmTKFnTt31npNX19fxo4dy/PPP8/KlSv5999/2bBhA2+++SYAERER6HQ6vv/+e3JyciguLgYcjQpnz57NK6+8wt69e9mxYwcrVqxg4cKFAPTp0welUsnAgQPZtWsX3377LfPnzz/Hn5AQoj5JsiOEOO8UCgXffvst3bp14/HHH+eKK66gd+/eHDhwgMjISAAefvhhJk+ezNixY+ncuTMHDx5kyJAhdV530qRJjB49msmTJ9OqVSsefvhhcnNzAVCr1SxevJjXX3+d6Oho7rvvPgCeeOIJ/u///o+3336bdu3acf311/P22287j6r7+/vzn//8h127dtGxY0cmTJjA3Llzz+GnI4Sobwq7bEgLIYQQ4iImKztCCCGEuKhJsiOEEEKIi5okO0IIIYS4qEmyI4QQQoiLmiQ7QgghhLioSbIjhBBCiIuaJDtCCCGEuKhJsiOEEEKIi5okO0IIIYS4qEmyI4QQQoiLmiQ7QgghhLioSbIjhBBCiIva/wMpy/gGWbB8EgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Iterate over targets (adenosine receptors)\n", + "for target, accession in adenosine_receptors.items():\n", + " # Split dataset in training and test set (leave one target out split)\n", + " print(\"== Leave one target out split ==\")\n", + " train_loto, test_loto = split_train_test(ar_pcm_dataset, 0.20, \"loto\", target, accession)\n", + " # Train and validate PCM model, every time leaving a different target out for validation\n", + " train_validate_pcm_model(adenosine_receptors, train_loto, test_loto)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Immediately we see that the LOTO split method is way more difficult to model than the random split. The PCM metrics show that even though the true and predicted values are somewhat correlated (Pearson's $r$), the PCM model features are not able to explain the variance in the target variable ($R^{2}$). We can also see this in the shape of the predicted vs. observed graph, where the datapoints are not aggregated around the unit line that would define a perfect fit. Rather, the predictions are aggregated around the mean bioactivity values in the training set." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Discussion\n", + "\n", + "In this talktorial we created a PCM model for the four adenosine receptors based on a random split of the data. This model performed pretty well on our test set. Compared to independent QSAR models trained for each of the adenosine receptors, the performance of the PCM model is slightly better, which indicates that the PCM model is able to extrapolate between targets. However, there are several elements that could have an effect of the observed results:\n", + "\n", + "* The four adenosine receptors had enough data on their own to be able to train individual models. The true advantage of a PCM model could be more relevant in a target set where some targets have very little data.\n", + "* The QSAR models are only trained on 22 features compared to 1,300 for the PCM model. QSAR models trained on molecular fingerprints would probably have better chances of achieving better performance.\n", + "* For better comparison, it would be good to train several models of the same type and calculate aggregated metrics, so that statistically significant results could be derived.\n", + "\n", + "Moreover, we trained four PCM models on three adenosine receptors and validated them on the remaining receptor, following a leave one target out (LOTO) split method. We did this to evaluate whether these PCM models could be used to predict bioactivity for a target for which the model has never seen any data in training. We immediately derive some observations:\n", + "\n", + "* The LOTO split is a more challenging form of validation than the random split, since the random split allows data leakage between targets.\n", + "* While the descriptors used in the PCM model trained on random split allowed for a good performance, in order to get a good performance in the LOTO split, we would need to search more carefully to find the optimal descriptors. Similarly, we could opt for a selection of the binding pocket prior to protein descriptor generation. Additionally, we could optimize the model parameters.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Quiz\n", + "\n", + "1. What types of features are needed for PCM?\n", + "2. What types of training/test set splitting methods commonly used in PCM modeling do you know?\n", + "3. Which applications do you know of PCM in drug discovery?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.14" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}