Drkcore

26 02 2016 chemoinformatics Tweet

MMPを効率的に格納するためのデータ構造

今まではMMPはIDのペアと活性値の差分だけ持っていれば良かったので適当なスキーマのデータベースに放り込んでいたんだけど、Monitoring the Progression of Structure–Activity Relationship Information during Lead Optimizationというアッツい論文を読んでから、うちでもMMSとかSARM_disc_scoreとか出したいと思っていたが、やる気が無いので放置していた。

最近データベースを作りなおす機会があったので構造も新しく考えてみた。

MMPはCore(共通骨格)とペアのそれぞれのフラグメントに分けられるのでone-to-manyで割とシンプルにかけるんだけど、それぞれのFragmentからのbackrefをmmpsにしちゃうとエラーが出るので変なナンバリングしないといけなかった。

from sqlalchemy import Column, String, DateTime, Float, Integer, ForeignKey
from sqlalchemy.orm import relationship
from MMP.database import Base

class MMP(Base):
    __tablename__ = "mmps"
    id = Column(Integer, primary_key=True)
    core_id = Column(Integer, ForeignKey('cores.id'))
    fragment1_id = Column(Integer, ForeignKey('fragments.id'))
    fragment2_id = Column(Integer, ForeignKey('fragments.id'))
    activity_id = Column(Integer, ForeignKey('activities.id'))
    compound1_id = Column(String(6))
    compound2_id = Column(String(6))
    fragment1 = relationship("Fragment", foreign_keys='MMP.fragment1_id', backref="mmps1")
    fragment2 = relationship("Fragment", foreign_keys='MMP.fragment2_id', backref="mmps2")

    def __init__(self, **kargs):
        self.compound1_id = kargs["compound1_id"]
        self.compound2_id = kargs["compound2_id"]

    @property
    def mmp_id(self):
        return "{}-{}".format(self.compound1_id, self.compund2_id)

class Core(Base):
    __tablename__ = "cores"
    id = Column(Integer, primary_key=True)
    mmps = relationship("MMP", uselist=True, backref="core")
    smiles_string = Column(String(255), unique=True)

    def __init__(self, **kargs):
        self.smiles_string = kargs["smi"]

class Fragment(Base):
    __tablename__ = "fragments"
    id = Column(Integer, primary_key=True)
    smiles_string = Column(String(255), unique=True)

    def __init__(self, **kargs):
        self.smiles_string = kargs["smi"]

実際のデータはMMPクラスと活性クラスをひも付けてあるのでSARM_disc_scoreとかMMSの抽出とか簡単になるはず。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021