読者です 読者をやめる 読者になる 読者になる

kivantium活動日記

プログラムを使っていろいろやります

原始状態における細胞分裂のシミュレーション

生物学 論文紹介

journals.aps.org
を読んでそれっぽいものを作ってみたという話です

背景と目的

細胞内ではたくさんの化学物質が触媒し合って複雑な反応ネットワークを作っています。細胞分裂の時にはこの反応ネットワークがかなり維持された状態で二つに分かれます。この性質、すなわち遺伝がどのように生まれてくるのかを解明しようという動機のもとこの研究は行われているようです。

以前の研究から化学物質のうち割合の少ないものが反応全体をコントロールするようになるだろうと考えられています。これは、割合の多い分子が変異して性質に変化が発生しても他の大量の分子が今までと同じように働くことで影響が薄められるのに対し、割合の少ない物質が変異すると全体の反応に大きな影響が起きることが原因です。この「割合が少ないもの」は実際の細胞ではDNAに相当します。

この「少数コントロール」状況下において細胞分裂がどのように起こるのかを調べるのがこの論文の目的です。

モデル

一番簡単なシステムを考えるという"physicists' golden rule"に従い、2つの分子からなる簡単な系を採用します。
今回の実装は次のようなモデルになっています。

  • 2種類の分子XとYが存在する。Xの数は多く、Yの数は少ない(Yによる少数コントロール)
  • XとYはランダムに動いている(ブラウン運動モデリング
  • XとYの距離が一定以下になるとそれぞれ一定の確率でa)Yの数は変わらずXが1つ増える b)Xの数は変わらずYが増える。aの確率はbの確率よりずっと高い(触媒反応のモデリング
  • XとYは一定の確率で分解する

実装

遺伝的アルゴリズムで棒倒しシミュレーションのプログラムを改造して上記のモデルを動かしてみました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import random
import sys
import math
import copy

SCR_RECT = Rect(0, 0, 600, 600)  # スクリーンサイズ

# 分子Xのクラス
class molX:
    def __init__(self, x, y):
        self.x = x 
        self.y = y 
# 分子Yのクラス
class molY:
    def __init__(self, x, y):
        self.x = x 
        self.y = y 

#メインの動作
class Simulation:
    def __init__(self):
        # ウィンドウ設定など
        pygame.init()
        screen = pygame.display.set_mode(SCR_RECT.size)
        pygame.display.set_caption("シミュレーション")
        self.font = pygame.font.SysFont(None, 20)
        clock = pygame.time.Clock()
        # 分子オブジェクトの作成
        self.X =[]
        self.Y =[molY(300, 300)]
        # 分子XをYの周りに10個ランダムに配置
        for i in range(10):
            self.X.append(molX(self.Y[0].x+random.randint(-30, 30), self.Y[0].y+random.randint(-30, 30)))
        # メインループ
        while True:
            self.update()           #各分子の位置を更新
            clock.tick(40)          #ディレイの設定
            self.draw(screen)       #情報の描画
            pygame.display.update() #描画の反映
            #終了処理
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        pygame.quit()
                        sys.exit()
            self.update()
   
    # 距離を求める関数
    def distance(self, x1, y1, x2, y2):
        return math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

    # 分子の位置を更新
    def update(self):
        status = False
        # 分子Xのブラウン運動
        for molecule in self.X:
            molecule.x += random.randint(-3,3)
            molecule.y += random.randint(-3,3)
        #分子Yのブラウン運動
        for molecule in self.Y:
            molecule.x += random.randint(-2,2)
            molecule.y += random.randint(-2,2)

        # 触媒反応
        for moleculeX in self.X:
            reaction = False
            for moleculeY in self.Y:
                #距離が15以下なら反応
                if self.distance(moleculeX.x, moleculeX.y, moleculeY.x, moleculeY.y) < 15:
                    # Yが増える(確率0.5%, 2つ以上にならないようにしている)
                    if random.randint(0, 200) < 1 and len(self.Y) == 1:
                        self.Y.append(molY(moleculeY.x, moleculeY.y))
                    # Xが増える(確率95%)
                    if random.randint(0,100) < 95:
                        self.X.append(molX(moleculeX.x, moleculeX.y))
                    reaction = True
            if reaction == True:    #同じ位置に増えて無限ループになるのを防ぐ処理
                break
        # Xの分解反応
        for molecule in self.X:
            if random.randint(0, 120) < 1:
                self.X.remove(molecule)


    # 描画
    def draw(self, screen):
        #背景(黒)の描画
        pygame.draw.rect(screen, (0,0,0), Rect(0,0,600,600))
        # 分子の描画
        for molecule in self.X:
            pygame.draw.circle(screen, (0,255,0), (molecule.x, molecule.y), 4)
        for molecule in self.Y:
            pygame.draw.circle(screen, (255,0,0), (molecule.x, molecule.y), 4)

#実行
if __name__ == "__main__":
    Simulation()

何回もやった結果こういう細胞分裂っぽい状況が起こりました
f:id:kivantium:20150424212628p:plain

感想

論文の結論としては少数コントロール状況下では少数側の分子が離れることによって分子クラスタが分離し、細胞分裂のような現象が起こるということのようですが、今回の実験の範囲だとパラメータを調整して何回も実験を繰り返さないと細胞分裂らしきものが観測できませんでした。論文の重要なパラメータを見逃しているかもしれないので何とも言えないのですが……