[PYTHON] Obtenir les données structurelles de CHEMBLID

introduction

J'ai contacté ChEMBL de CHEMBLID pour savoir comment récupérer des données structurelles telles que SDF et SMILES.

Acquisition d'un seul composé SDF (MOL)

Tout d'abord, pour obtenir des données MOL en spécifiant un seul ChEMBLID, tapez simplement l'URL comme suit. CHEMBLID en spécifie un prédéterminé. Le but ici est d'ajouter format = sdf à la fin.

https://www.ebi.ac.uk/chembl/api/data/molecule/CHEMBL1607289?format=sdf

Acquisition de SDF pour plusieurs composés

Ensuite, pour spécifier plusieurs ChEMBLID et obtenir SDF à la fois, saisissez simplement l'URL suivante. Le point ici est que lors de la spécification de plusieurs ID ChEMBLE, ils sont séparés par un point-virgule.

https://www.ebi.ac.uk/chembl/api/data/molecule/set/CHEMBL1607289;CHEMBL1607290?format=sdf

Acquisition de données composées

Pour obtenir diverses données telles que le poids moléculaire et SMILES au lieu de SDF, format = sdf ne doit pas être spécifié comme suit.

https://www.ebi.ac.uk/chembl/api/data/molecule/set/CHEMBL1607289

Ensuite, les données composées peuvent être obtenues au format XML suivant.

<?xml version="1.0" encoding="utf-8"?>
<response>
  <molecules>
    <molecule>
      <atc_classifications/>
      <availability_type>-1</availability_type>
      <biotherapeutic/>
      <black_box_warning>0</black_box_warning>
      <chebi_par_id/>
      <chirality>-1</chirality>
      <cross_references>
        <molecule>
          <xref_id>26754105</xref_id>
          <xref_name>SID: 26754105</xref_name>
          <xref_src>PubChem</xref_src>
        </molecule>
      </cross_references>
      <dosed_ingredient/>
      <first_approval/>
      <first_in_class>-1</first_in_class>
      <helm_notation/>
      <indication_class/>
      <inorganic_flag>-1</inorganic_flag>
      <max_phase/>
      <molecule_chembl_id>CHEMBL1607289</molecule_chembl_id>
      <molecule_hierarchy>
        <molecule_chembl_id>CHEMBL1607289</molecule_chembl_id>
        <parent_chembl_id>CHEMBL1607289</parent_chembl_id>
      </molecule_hierarchy>
      <molecule_properties>
        <acd_logd>-2.11</acd_logd>
        <acd_logp>-2.11</acd_logp>
        <acd_most_apka>13.22</acd_most_apka>
        <acd_most_bpka>5</acd_most_bpka>
        <alogp>-1.58</alogp>
        <aromatic_rings>1</aromatic_rings>
        <full_molformula>C16H22N2O6</full_molformula>
        <full_mwt>338.36</full_mwt>
        <hba>8</hba>
        <hba_lipinski>8</hba_lipinski>
        <hbd>4</hbd>
        <hbd_lipinski>4</hbd_lipinski>
        <heavy_atoms>24</heavy_atoms>
        <molecular_species>NEUTRAL</molecular_species>
        <mw_freebase>338.36</mw_freebase>
        <mw_monoisotopic>338.1478</mw_monoisotopic>
        <num_lipinski_ro5_violations/>
        <num_ro5_violations/>
        <psa>123.35</psa>
        <qed_weighted>0.49</qed_weighted>
        <ro3_pass>N</ro3_pass>
        <rtb>3</rtb>
      </molecule_properties>
      <molecule_structures>
        <canonical_smiles>COC(=O)[C@@H]1C[C@@]2(O)[C@H](O)[C@H](O)[C@H](O)C[C@H]2N1Cc3cccnc3</canonical_smiles>
        <standard_inchi>InChI=1S/C16H22N2O6/c1-24-15(22)10-6-16(23)12(5-11(19)13(20)14(16)21)18(10)8-9-3-2-4-17-7-9/h2-4,7,10-14,19-21,23H,5-6,8H2,1H3/t10-,11+,12+,13+,14+,16-/m0/s1</standard_inchi>
        <standard_inchi_key>JKLLFWDPMLWZFY-SFEJEDPTSA-N</standard_inchi_key>
      </molecule_structures>
      <molecule_synonyms/>
      <molecule_type>Small molecule</molecule_type>
      <natural_product>-1</natural_product>
      <oral/>
      <parenteral/>
      <polymer_flag/>
      <pref_name/>
      <prodrug>-1</prodrug>
      <structure_type>MOL</structure_type>
      <therapeutic_flag/>
      <topical/>
      <usan_stem/>
      <usan_stem_definition/>
      <usan_substem/>
      <usan_year/>
      <withdrawn_class/>
      <withdrawn_country/>
      <withdrawn_flag/>
      <withdrawn_reason/>
      <withdrawn_year/>
    </molecule>
  </molecules>
</response>

Obtenir de Python

Enfin, en utilisant la méthode examinée cette fois, j'ai écrit un programme Python qui obtient collectivement SDF et SMILES à partir de la liste des ID CHEMBLE décrits dans le fichier texte.

GetStructureFromChEMBLE.py


import argparse
import requests
import xml.etree.ElementTree as ET


def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("-input", type=str, required=True)
    parser.add_argument("-type", type=str, default="sdf", choices=["sdf", "smiles"]),
    parser.add_argument("-output", type=str, required=True)
    args = parser.parse_args()

    ids_str = ""
    ids = []
    with open(args.input) as f:
        lines = f.readlines();
        for line in lines:
            line = line.rstrip()
            if len(ids_str) > 0:
                ids_str += ";"
            ids_str += line
            ids.append(line)

    url = "https://www.ebi.ac.uk/chembl/api/data/molecule/set/" + ids_str
    if args.type == "sdf":
        url += "?format=sdf"

    result = requests.get(url)

    if args.type == "sdf":
        with open(args.output, "w") as f:
            f.write(result.text)
    else:
        root = ET.fromstring(result.text)
        with open(args.output, "w") as f:
            for i in range(len(root[0])):
                structures = root[0][i].find("molecule_structures")
            
                f.write("{0}\t{1}\t{2}\n".format(
                    ids[i],
                    structures.find("canonical_smiles").text,
                    structures.find("standard_inchi").text))


if __name__ == "__main__":
    main()

Pour l'utiliser, spécifiez le fichier qui décrit la liste des ID CHEMBLE ligne par ligne avec l'option -input, et spécifiez sdf ou sourires avec l'option -type. Spécifiez ensuite le fichier de sortie avec l'option -output.

Exemple de fichier d'entrée

input.txt


CHEMBL6329
CHEMBL6328
CHEMBL265667
CHEMBL6362
CHEMBL267864

Exemple de fichier de sortie Lorsque -type = smiles est spécifié, CHEMLEID, SMILES et Inchi sont affichés au format délimité par des tabulations, comme indiqué ci-dessous.

output.tsv


CHEMBL6329	Cc1cc(ccc1C(=O)c2ccccc2Cl)N3N=CC(=O)NC3=O	InChI=1S/C17H12ClN3O3/c1-10-8-11(21-17(24)20-15(22)9-19-21)6-7-12(10)16(23)13-4-2-3-5-14(13)18/h2-9H,1H3,(H,20,22,24)
CHEMBL6328	Cc1cc(ccc1C(=O)c2ccc(cc2)C#N)N3N=CC(=O)NC3=O	InChI=1S/C18H12N4O3/c1-11-8-14(22-18(25)21-16(23)10-20-22)6-7-15(11)17(24)13-4-2-12(9-19)3-5-13/h2-8,10H,1H3,(H,21,23,25)
CHEMBL265667	Cc1cc(cc(C)c1C(O)c2ccc(Cl)cc2)N3N=CC(=O)NC3=O	InChI=1S/C18H16ClN3O3/c1-10-7-14(22-18(25)21-15(23)9-20-22)8-11(2)16(10)17(24)12-3-5-13(19)6-4-12/h3-9,17,24H,1-2H3,(H,21,23,25)
CHEMBL6362	Cc1ccc(cc1)C(=O)c2ccc(cc2)N3N=CC(=O)NC3=O	InChI=1S/C17H13N3O3/c1-11-2-4-12(5-3-11)16(22)13-6-8-14(9-7-13)20-17(23)19-15(21)10-18-20/h2-10H,1H3,(H,19,21,23)
CHEMBL267864	Cc1cc(ccc1C(=O)c2ccc(Cl)cc2)N3N=CC(=O)NC3=O	InChI=1S/C17H12ClN3O3/c1-10-8-13(21-17(24)20-15(22)9-19-21)6-7-14(10)16(23)11-2-4-12(18)5-3-11/h2-9H,1H3,(H,20,22,24)

en conclusion

Il y a une explication de l'API dans l'URL de référence, mais il n'y a pas assez d'informations, j'ai donc dû réfléchir et faire des erreurs en piratant la source du client de ressources Web ChEMBL précédemment installé. J'ai également installé ChEMBL V25 localement, donc j'aimerais le pirater à partir de maintenant.

référence

Recommended Posts

Obtenir les données structurelles de CHEMBLID
Obtenir des données de Quandl en Python
Obtenez des données de Twitter avec Tweepy
[Note] Obtenir des données de PostgreSQL avec Python
Obtenez des données de Cloudant avec le flacon Bluemix
Obtenez des données d'un oscilloscope avec pyVISA
Obtenez plus de 10 données du magasin de paramètres SSM
Obtenez des fichiers de données ailleurs pendant l'installation de pip
Extraction de données depuis S3
Obtenez des données compressées par Gzip en mémoire
Obtenez des données du module GPS à 10 Hz avec Python
Obtenir des données de la base de données via ODBC avec Python (Access)
Exporter des données 3D depuis QGIS
Obtenez des données Youtube avec python
Obtenir le presse-papiers à partir des paramètres Maya
Appuyez sur REST en Python pour obtenir des données de New Relic
Obtenez des données de l'API d'analyse avec le client API Google pour python
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
Obtenez des données de VPS MySQL avec Python 3 et SQL Alchemy
Utilisez ScraperWiki pour obtenir régulièrement des données de votre site Web
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc Préparation 1
Obtenez des données LeapMotion en Python.
De l'installation d'Elasticsearch à la saisie des données
Python: exclure les balises des données html
Obtenez l'historique des tweets de célébrités sur Twitter
Obtenir des données Salesforce à l'aide de l'API REST
Frappez les données du trésor de Python Pandas
Extraire des données spécifiques d'un JSON complexe
Obtenez les données de graduation complètes pour bitflyer
Obtenir une colonne de DataFrame avec DataFrame
[Python] Obtenez des données économiques avec DataReader
Structure de données persistante créée à partir de zéro
Obtenez des données Amazon à l'aide de Keep API # 1 Obtenez des données
[Débutant] Récupérer de la base de données Django Query
python Obtenez la météo à venir de l'API météo
[Bases de la science des données] Acquisition de données à partir de l'API
Obtenir une adresse à partir d'un code postal
Obtenez les données d'enregistrement de bataille de Splatoon 2 + bonus