26 02 2016 chemoinformatics Tweet
今までは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の抽出とか簡単になるはず。