CIRpyを活用した化合物情報の取得

CIRpyについて

アメリカ国立衛生研究所(NIH)が提供している化学情報検索サービスChemical Identifer Resolver (CIR)を利用すると、化合物の情報(SMILESやIUPAC名など)を検索キーワードとして、その化合物の情報を取得できる。

このサービス、webURLがAPIのように利用できるため、コードを書くことでプログラム的に情報を取得することが可能。
(web URLの利用に関しては、以下の記事参照)

  1. NIHのChemical identifer resolverでcas番号、SMILES、InChiKey、IUPAC名を取得しよう
  2. CAS番号もしくは化合物名からSMILESを取得する

更に、CIRpyという本サービスのPythonモジュールがあり、これを使うのが一番簡単な方法みたい。

同様の化合物情報取得モジュールであるpubchempyに比べると情報の取得率が低いらしいが、pubchempyでは取得できないCAS番が取得できるため、割と使える場面は多いかもしれない。
pubchemについての記事はこちら)

インストール

pip install cirpy

コード

基本的な使い方

第1パラメータは入力文字列で、第2パラメータに希望する出力表現を記載する。

第2パラメーターの主な出力表現は以下
casname は、リスト形式で結果が返ってくる)

  • stdinchi
  • stdinchikey
  • inchi
  • smiles
  • ficts
  • ficus
  • uuuuu
  • hashisy
  • sdf
  • names
  • iupac_name
  • cas
  • formula
import cirpy

name = "Ethanol"
cas_list = cirpy.resolve(name, "cas")
name_list = cirpy.resolve(name, "names")
iupac_name_list = cirpy.resolve(name, "iupac_name")
smiles = cirpy.resolve(name, "smiles")

print(cas_list)
print(name_list[:10])
print(iupac_name_list)
print(smiles)

結果

['121182-78-3', '64-17-5', '8024-45-1', '8000-16-6', '68475-56-9', '71076-86-3', '71329-38-9']
['ethanol', '121182-78-3', '64-17-5', '8024-45-1', '8000-16-6', '68475-56-9', '71076-86-3', '71329-38-9', 'Ethyl alcohol & water, 50%', 'Ethyl alcohol & water, 60%']
ethanol
CCO

casに関しては、古いCAS?も含まれるみたいなので注意が必要かも。(参考|ethanolのcas
(pubchempyの検索で引っかかるかどうかを確認することで古いCASは除外できそう)

化合物名(name)もcasが含まれていたりだいぶ雑な感じになっている。

pubchempyを活用したcasの選別

(参考|pubchem から化合物情報を一気に取得する)

import pandas as pd
import pubchempy as pcp
properties = ['MolecularFormula','CanonicalSMILES', 'IUPACName']

df = pd.DataFrame()
for cas in cas_list:
    try:
        temp = pcp.get_properties(properties, cas, 'name',as_dataframe=True)
        #as_dataframe=True とすることでpandas dataframe として情報を取得可能
        temp['CAS'] = cas
        df = pd.concat([df,temp],axis=0,join='outer',sort=True)
    except:
        pass

display(df)

結果

CASCanonicalSMILESIUPACNameMolecularFormula
CID
70264-17-5CCOethanolC2H6O
70268475-56-9CCOethanolC2H6O

ファイルの取得

さまざまなファイル形式で出力を返すこともできる

  • alc # Alchemy format
  • cdxml # CambridgeSoft ChemDraw XML format
  • cerius # MSI Cerius II format
  • charmm # Chemistry at HARvard Macromolecular Mechanics file format
  • cif # Crystallographic Information File
  • cml # Chemical Markup Language
  • ctx # Gasteiger Clear Text format
  • gjf # Gaussian input data file
  • gromacs # GROMACS file format
  • hyperchem # HyperChem file format
  • jme # Java Molecule Editor format
  • maestro # Schroedinger MacroModel structure file format
  • mol # Symyx molecule file
  • mol2 # Tripos Sybyl MOL2 format
  • mrv # ChemAxon MRV format
  • pdb # Protein Data Bank
  • sdf3000 # Symyx Structure Data Format 3000
  • sln # SYBYL Line Notation
  • xyz # xyz file format
name = "Ethanol"
cif = cirpy.resolve(name, "cif")
print(cif)

結果

data_C2H6O
#
_chem_comp.id   'C2H6O'
#
loop_
_chem_comp_atom.comp_id
_chem_comp_atom.atom_id
_chem_comp_atom.type_symbol
_chem_comp_atom.charge
_chem_comp_atom.model_Cartn_x
_chem_comp_atom.model_Cartn_y
_chem_comp_atom.model_Cartn_z
C2H6O   A1  C   0   0.0072  -0.5687 -0.0000
C2H6O   A2  C   0   -1.2854 0.2499  -0.0000
C2H6O   A3  O   0   1.1304  0.3147  0.0000
C2H6O   A4  H   0   0.0392  -1.1972 0.8900
C2H6O   A5  H   0   0.0392  -1.1972 -0.8900
C2H6O   A6  H   0   -1.3175 0.8784  0.8900
C2H6O   A7  H   0   -1.3175 0.8784  -0.8900
C2H6O   A8  H   0   -2.1422 -0.4239 -0.0000
C2H6O   A9  H   0   1.9857  -0.1365 -0.0000
#
loop_
_chem_comp_bond.comp_id
_chem_comp_bond.atom_id_1
_chem_comp_bond.atom_id_2
_chem_comp_bond.value_order
C2H6O   A1  A2  SING
C2H6O   A1  A3  SING
C2H6O   A1  A4  SING
C2H6O   A1  A5  SING
C2H6O   A2  A6  SING
C2H6O   A2  A7  SING
C2H6O   A2  A8  SING
C2H6O   A3  A9  SING
#

物性情報の取得

構造ベースから計算できる以下の情報も取得可能

  • mw # (Molecular weight)
  • h_bond_donor_count
  • h_bond_acceptor_count
  • h_bond_center_count
  • rule_of_5_violation_count
  • rotor_count
  • effective_rotor_count
  • ring_count
  • ringsys_count
h_bond_acceptor_count = cirpy.resolve('coumarin 343', 'h_bond_acceptor_count')
print(h_bond_acceptor_count)

結果
5

Moleculeクラスを使う

moleculeオブジェクトを作って、後から色々な情報を取り出す方法もある

from cirpy import Molecule

mol = Molecule('N[C@@H](C)C(=O)O')

print(mol.mw)
print(mol.iupac_name)
print(mol.cas)

結果

89.0938
(2S)-2-aminopropanoic acid
['115967-49-2', '170805-71-7', '130380-93-7', '77160-91-9', '25191-17-7', '18875-37-1']

参考URL

  1. 公式ドキュメント
  2. NIHのChemical identifer resolverでcas番号、SMILES、InChiKey、IUPAC名を取得しよう
  3. CAS番号もしくは化合物名からSMILESを取得する
  4. CIRpyを使ってみた。
  5. 化合物名→SMILESの変換にはCIRpy|qiita

関連書籍