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 を参照してください。