In [1]:
%matplotlib inline
from ecell4 import *
from ecell4_base.core import *
E-Cell4には Model, World, Simulator の3つの基本コンポーネントがあります.
これらのコンポーネントはシミュレーションにおける下記の概念を表します.
Model はその名の通りシミュレートする内容を表します.World はある状態を表します.例えば初期条件やあるタイムポイントでの状態などです.Simulator はソルバーについて表します.Model はソルバーから独立しています。
すべてのソルバーは、単一の Model インスタンスを共有することができます。
各ソルバーのアルゴリズムには対応する World と Simulator のペアがあります(これらのペアは Factory クラスにカプセル化されています).
World は必ずしも Model と Simulator に結びついている必要はありませんが,Simulator は Model と World の両方が必要です.
シミュレーションを実行する前に Model を作成する必要があります.
E-Cell4は Model を構築するための複数の方法をサポートしています.
(モデルの構築方法も参照してください.)
ここでは reaction_rules 関数と with ステートメントを使用する最も簡単な方法を説明します.
In [2]:
with reaction_rules():
A + B > C | 0.01 # equivalent to create_binding_reaction_rule
C > A + B | 0.3 # equivalent to create_unbinding_reaction_rule
m1 = get_model()
print(m1)
reaction_rules の後に括弧()を書くことを覚えておいてください.
ここでは、2つの ReactionRule を持つ m1 という名前のモデルが作成されました.
with ブロックの行は、それぞれ結合と乖離の ReactionRule を表しています.
質量作用の法則を示す反応の速度はセパレーター | の後に定義します.
すなわち 0.01 もしくは 0.3 が反応速度になります.
通常の微分方程式の形では,このモデルは次のように記述できます.
よりコンパクトな記述として
A + B == C | (0.01, 0.3) と書くことも可能です.
E-Cell4には、run_simulation という特定のモデルでシミュレーションを実行するためのシンプルなインターフェイスがあります。
これにより、自分で World とSimulator をインスタンス化せずにシミュレーションを実行することができます。
(ただモデルを解くには、ボリューム、各種の初期値と時間は与えなければなりません。)
In [3]:
run_simulation(10.0, model=m1, y0={'A': 60, 'B': 60}, volume=1.0)
シミュレーションアルゴリズムを切り替えるのは、次のようにソルバの型を指定するだけでできます。
( デフォルトでは ode が使われるようになっています)
In [4]:
run_simulation(10.0, model=m1, y0={'A': 60, 'B': 60}, solver='gillespie')
In [5]:
with species_attributes():
A | B | C | {'radius': 0.005, 'D': 1} # 'D' is for the diffusion coefficient
with reaction_rules():
A + B == C | (0.01, 0.3)
m2 = get_model()
Speciesの属性は文字列か、数値、真偽値のいずれかでなければなりません。
今度は、上記と同じ方法で空間シミュレーションを実行できます (egfrd の場合、シミュレーションし終わるまでにかかる時間は長くなります)。
In [6]:
run_simulation(10.0, model=m2, y0={'A': 60, 'B': 60}, solver='meso')
Structure (例えば 膜、細胞質および核といったもの) は、今のところ spatiocyte および meso でのみのサポートとなっています。
シミュレーションのための各 Species が属する location と dimension は、その属性で指定しなければなりません。
In [7]:
with species_attributes():
A | {'D': '1', 'location': 'S', 'dimension': 3} # 'S' is a name of the structure
S | {'dimension': 3}
m3 = get_model() # with no reactions
E-Cell4はプリミティブなシェイプを Sphere のような構造体としてサポートしています:
In [8]:
sphere = Sphere(Real3(0.5, 0.5, 0.5), 0.48) # a center position and radius
E-Cell4は、シミュレーション中に状態を記録する様々な種類の Observer を提供しています。
下記では2つの Observer が分子の位置を記録すると宣言されています。
FixedIntervalTrajectoryObserver は分子の軌跡を記録し、FixedIntervalHDF5Observer は World を与えられた時間間隔でHDF5ファイルに保存します:
In [9]:
obs1 = FixedIntervalTrajectoryObserver(1e-3)
obs2 = FixedIntervalHDF5Observer(0.1, 'test%02d.h5')
run_simulation は構造体とオブザーバを引数 structures と observers として受け取りることができます(help(run_simulation)も参照してください):
In [10]:
run_simulation(1.0, model=m3, y0={'A': 60}, structures={'S': sphere},
solver='spatiocyte', observers=(obs1, obs2), return_type=None)
E-Cell4には、viz.plot_world というインタラクティブな視覚化が可能な World を視覚化する機能があります。
viz.plot_world は、分子の位置を3Dでプロットします。
さらに、load_world を使用することで、HDF5ファイルからWorldの状態を簡単に復元することができます。
In [11]:
# viz.plot_world(load_world('test00.h5'), species_list=['A'])
viz.plot_world(load_world('test00.h5'), species_list=['A'], interactive=True)
また、 FixedIntervalTrajectoryObserver の場合、viz.plot_trajectory は軌道のプロットを生成します。(ここでもインタラクティブなプロットの生成が可能です。):
In [12]:
# viz.plot_trajectory(obs1)
viz.plot_trajectory(obs1, interactive=True)
より詳しくは 5. How to Log and Visualize Simulations を参照してください。