pyMEA コードガイド

MEA計測データ解析を、コピペで始める

初心者向け — 読み込み・ピーク検出・描画・数値計算の基本パターン

pyMEA コードガイド

このガイドのゴール

pyMEA は MEA(多点電極アレイ) で計測した心筋・神経細胞の電位データを解析するライブラリです。

  • 専門のプログラミング知識がなくてもコピペで動かせる
  • データ読み込み → 解析 → グラフ化を一連の流れで習得
  • まずは「こう書けば動く」を体で覚えるのが近道

読み方のコツ:各スライドのコードはそのまま実行できます。ファイルのパスだけ自分のものに書き換えて試してみましょう。

pyMEA コードガイド

アジェンダ

章 内容
1 インストール
2 データの読み込み・保存(.npz)
3 ピーク抽出
4 グラフ描画
5 動画作成
6 数値計算(ISI / FPD / 伝導速度)
pyMEA コードガイド

1. インストール

最初の一歩。環境を整えよう

pyMEA コードガイド

インストール

ターミナル(Windows は Git Bash)で1行打つだけ。

pip install git+https://github.com/kkito0726/MEA_modules.git

最新版へアップデートする場合:

pip uninstall pyMEA -y
pip install git+https://github.com/kkito0726/MEA_modules.git

ポイント:pip は Python のライブラリを入れる道具です。Python 3.12 での利用を推奨します。

pyMEA コードガイド

クラス構造を理解する

pyMEA では PyMEA という1つのオブジェクトがすべての機能への入口になります。

diagram

初心者向け解説:mea.fig.showAll() のように ドット(.)でたどる だけで目的の機能に届きます。「mea の中の fig(描画)の showAll(全表示)」と読めばOKです。

pyMEA コードガイド

2. データの読み込み

解析はデータを読むところから

pyMEA コードガイド

import 文

ファイルの先頭に、おまじないを1行書きます。

from pyMEA import *
  • *(アスタリスク)は「必要なものを全部まとめて読み込む」という意味
  • これ1行で read_MEA・detect_peak_neg などがすべて使えるようになる

ポイント:まずはこの1行。何を import するか迷う必要はありません。

pyMEA コードガイド

基本の読み込み

read_MEA() に 4つの情報 を渡すだけでデータが読めます。

from pyMEA import *

hed_path = "/Users/you/data.hed"  # ① 計測ファイルのパス
start, end = 0, 30                # ② 読み込む範囲(秒)
electrode_distance = 450          # ③ 電極間の距離(μm)

mea = read_MEA(hed_path, start, end, electrode_distance)
  • 戻り値の mea が、これ以降すべての解析の起点
  • start〜end 秒だけ読むのでメモリを節約できる

補足:electrode_distance(電極間距離)は伝導速度などの計算に使う値です。お使いの MEA チップに合わせて指定します(例では 450μm)。

pyMEA コードガイド

フィルターありで読み込む

ノイズ処理をかけたいときは、第5引数に FilterType を指定します。

# 神経細胞 → 移動平均フィルター
mea = read_MEA(hed_path, start, end,
               electrode_distance, FilterType.FILTER_MEA)

# 心筋細胞 → 平均波形(拍動を重ね合わせて平滑化)
mea = read_MEA(hed_path, start, end,
               electrode_distance, FilterType.CARDIO_AVE_WAVE)

ポイント:指定しなければ FilterType.NONE(フィルターなし)。まずはなしで読み込み、波形を見てからフィルターを検討するのがおすすめです。

pyMEA コードガイド

データの切り出し・変換

読み込んだ後でも、自由に加工できます。

# 0.25〜0.5 秒の区間だけ切り出す(小数でも指定OK)
mea_slice = mea.from_slice(0.25, 0.5)

# 時刻を 0 秒始まりにそろえる
mea = mea.init_time()

# データを 1/10 に間引いて処理を高速化
mea_light = mea.down_sampling(10)

重要な性質:これらの操作は元の mea を書き換えず、加工後の新しいデータを返します。元データが壊れないので、安心して何度でも試せます。

pyMEA コードガイド

データの保存・再読み込み(.npz)

MEAデータは容量が大きいので、解析の中間結果を軽量な .npz で保存して使い回せます。

# 保存(既定の int16 で約 1/2 サイズに圧縮)
mea.save_npz("data.npz")

# 再読み込み(電極間距離も復元されるので引数不要・高速)
mea = read_MEA_npz("data.npz")
  • .hed から読み直すより速く・軽く、区間を切り出した後の保存にも便利
  • 振幅の絶対値を厳密に保ちたいときは mea.save_npz("data.npz", dtype="float32")

⚠️ 必ず守る:.npz は元データから作った軽量コピーです。計測生データ(.hed / .bio)は必ずバックアップとして残し、削除しないでください。

pyMEA コードガイド

一括変換CLI「mea2npz」

たくさんの計測ファイルをまとめて .npz 変換できる Python不要の単一バイナリCLI も用意しています。

# インストール(初回1回だけ。Go/Python不要)
curl -fsSL https://raw.githubusercontent.com/kkito0726/MEA_modules/main/tools/mea2npz/install.sh | bash

# フォルダ内の .hed をまとめて変換(output/ に出力)
mea2npz ./measurements -recursive

# 引数なしなら対話モード(フラグを覚えなくてOK)
mea2npz
  • 出力は read_MEA_npz() でそのまま読め、pyMEA生成物と数値一致
  • 大量データの前処理を手早く・自動で済ませたいときに最適

📘 ドキュメント:かんたんマニュアル(初心者向け)
docs/mea2npz_manual.md / ツール詳細 tools/mea2npz/README.md

pyMEA コードガイド

3. ピーク抽出

波形の「山・谷」を自動で見つける

pyMEA コードガイド

ピーク抽出とは?

電位波形の中から、心筋・神経が活動した瞬間(とがった部分) を自動で拾う処理です。用途に応じて3種類あります。

関数 拾う向き よく使う場面
detect_peak_neg() 下ピーク(谷) 心筋でよく使う
detect_peak_pos() 上ピーク(山) 上向きの信号
detect_peak_all() 上下の両方 まとめて確認

ポイント:迷ったらまず detect_peak_neg()。最もよく使う基本の関数です。

pyMEA コードガイド

ピーク抽出 — サンプルコード

# 下ピークを抽出(最もよく使う)
peak_index_neg = detect_peak_neg(mea.data)

# うまく拾えないときは閾値(threshold)を調整
peak_index_neg = detect_peak_neg(mea.data, threshold=2)

# 電極 ch5 の「最初のピークが起きた時刻(秒)」を取得
time = mea.data[0][peak_index_neg[5]]
  • peak_index_neg は「何番目のデータ点か」を表すインデックスの配列
  • mea.data[0] が時間データ(先頭が時間軸)
  • 電極番号は 1〜64(mea.data[1]〜mea.data[64] が各電極)

つまずきポイント:ピークが多すぎ/少なすぎるときは threshold を上下させて調整します。次章の plotPeaks で目で確かめながら決めるのが確実です。

pyMEA コードガイド

4. グラフ描画

データは「見て」理解する

pyMEA コードガイド

64電極を一覧表示

8×8 の全電極の波形を、一枚にまとめて表示します。

# 0〜1秒、電位の表示範囲は ±300 μV
mea.fig.showAll(start=0, end=1,
                volt_min=-300, volt_max=300)
  • 全64電極の波形を俯瞰できる(どこが活発か一目でわかる)
  • 引数なしの mea.fig.showAll() でも動作する

ポイント:volt_min / volt_max は縦軸(電位)の表示範囲。波形が見切れたり潰れたりするときに調整します。

pyMEA コードガイド

1電極を拡大表示

気になった電極だけを、大きく詳しく見ます。

# 電極 ch2 の波形を拡大表示
mea.fig.showSingle(ch=2, start=0, end=1,
                   volt_min=-300, volt_max=300)

補足:showAll で全体を見て「これは?」と思った電極を、showSingle で深掘りする——この俯瞰→拡大の流れが解析の基本です。

pyMEA コードガイド

ピークをプロットして確認

検出したピークが正しい位置かを波形に重ねて確認します。

peak_index = detect_peak_neg(mea.data)

# ch2 の波形にピークを重ねて表示
mea.fig.plotPeaks(2, peak_index,
                  start=0, end=1,
                  volt_min=-300, volt_max=300)
  • 波形の上にマーカーでピーク位置が表示される
  • ピークがズレている/拾いすぎているときは threshold を再調整

ポイント:数値計算の前に必ずこれでチェック。ピーク検出の精度が解析結果の精度を決めます。

pyMEA コードガイド

拍動波形の重ね合わせ

各拍動の1stピークを基準に切り出して重ね描くと、ばらつきが一目でわかります。

import matplotlib.pyplot as plt

ch = 3                              # 重ね合わせる電極
before_sec, after_sec = 0.05, 0.3  # ピーク前後の切り出し秒数
sr = mea.data.SAMPLING_RATE
peaks = detect_peak_neg(mea.data)

# 秒 → フレーム数(from_slice の引数はフレーム番号)
before, after = int(before_sec * sr), int(after_sec * sr)

# 各ピーク前後を切り出し、時刻を0に揃えて重ね描き
mea_list = [mea.from_slice(i - before, i + after).init_time()
            for i in peaks[ch]]
plt.figure()
for m in mea_list:
    plt.plot(m.data[0], m.data[ch])
plt.ylim(-50, 150); plt.show()

重要:from_slice の引数はフレーム番号。秒は SAMPLING_RATE を掛けて変換します。

pyMEA コードガイド

ラスタープロット & ヒストグラム

複数電極の発火タイミングを、まとめて俯瞰します。

peak_index = detect_peak_neg(mea.data)
eles = [1, 2, 3, 4, 5]   # 見たい電極番号を指定

# ラスタープロット(発火タイミングを点で並べる)
mea.fig.raster_plot(peak_index=peak_index,
                    eles=eles, start=0, end=30)

# ヒストグラム(時間ごとの発火数を棒グラフに)
mea.fig.mkHist(peak_index=peak_index,
               eles=eles, start=0, end=30)

使いどころ:ラスタープロットは「いつ・どの電極が」発火したか、ヒストグラムは「全体でどれくらい」発火したかを見るのに便利です。

pyMEA コードガイド

カラーマップ描画

活動電位がどの向きに伝わったかを、空間的に可視化します。

peak_index = detect_peak_neg(mea.data)

# 2D カラーマップ(伝播方向の矢印つき)
mea.fig.draw_2d(peak_index=peak_index)

# 3D カラーマップ(立体的に表示)
mea.fig.draw_3d(peak_index=peak_index)

ポイント:色の濃淡=興奮の到達タイミング。興奮がどこから始まり、どこへ広がったかが直感的にわかります。

pyMEA コードガイド

5. 動画作成

時間変化を GIF で見せる

pyMEA コードガイド

GIF 動画を作る

isBuf=True で各コマ(フレーム)を画像として貯め、つなげて動画にします。

# 0.1秒ずつ時間をずらした100フレームのGIF
fig_images = [
    mea.fig.showAll(0 + i*0.1, 1 + i*0.1,
                    isBuf=True, dpi=100)
    for i in range(100)
]

video = VideoMEA(fig_images)
video.save_gif("output.gif", duration=0.1)   # ファイル保存
video.display_gif(duration=0.1)              # Jupyter上で再生

仕組み:isBuf=True は「画面に出さず画像として返す」スイッチ。それをリストに集めて VideoMEA に渡すと動画になります。

pyMEA コードガイド

カラーマップ動画

カラーマップ系は isBuf=True を付けるだけで、自動で動画になります。

peak_index = detect_peak_neg(mea.data)

# 拍動の周期ごとにフレームが自動生成される
video = mea.fig.draw_2d(peak_index=peak_index,
                        isBuf=True)

video.save_gif("colormap.gif", duration=0.1)

ポイント:手動でループを書かなくてOK。興奮伝播のアニメーションが手軽に作れます。

pyMEA コードガイド

6. 数値計算

ISI / FPD / 伝導速度を求める

pyMEA コードガイド

ISI(拍動間隔)の計算

ISI = Inter-Spike Interval。隣り合うピークの時間間隔で、拍動リズムの指標になります。

peak_index = detect_peak_neg(mea.data)

# ch2 の ISI を計算
isi = mea.calculator.isi(peak_index, ch=2)

isi.mean  # 平均値
isi.std   # 標準偏差
isi.se    # 標準誤差
isi.stv   # Short-Term Variability(拍動の揺らぎ)
isi.coefficient_of_variation  # 変動係数(CV)

ポイント:.mean や .std のようにドットで欲しい統計量を取り出すだけ。計算式を書く必要はありません。

pyMEA コードガイド

FPD(細胞外電位継続時間)

FPD = Field Potential Duration。心筋の活動電位の長さに相当し、QT間隔に対応する重要指標です。

peak_index = detect_peak_neg(mea.data)

# ch2 の FPD を計算
fpd = mea.calculator.fpd(peak_index, ch=2)

fpd.mean   # 平均値
fpd.std    # 標準偏差

# 検出位置を目で確認
fpd.show()

補足:fpd.show() で検出点を可視化できます。数値を信じる前に、まず目で確認する習慣をつけましょう。

pyMEA コードガイド

伝導速度の計算

2つの電極間で、信号が到達する時間差から興奮の伝わる速さを求めます。

peak_index = detect_peak_neg(mea.data)

# ch9 → ch54 間の伝導速度
cv = mea.calculator.conduction_velocity(
    peak_index, ch1=9, ch2=54
)

cv.mean  # 平均(m/s)
cv.std   # 標準偏差

ポイント:読み込み時に指定した electrode_distance(電極間距離)が、ここで速度の計算に効いてきます。

pyMEA コードガイド

まとめ

全体の流れをおさらい

pyMEA コードガイド

基本の流れ(コピペで動く)

from pyMEA import *

# 1. データ読み込み
mea = read_MEA("data.hed", start=0, end=30,
               electrode_distance=450)

# 2. ピーク抽出
peaks = detect_peak_neg(mea.data)

# 3. グラフで確認
mea.fig.showAll()
mea.fig.plotPeaks(2, peaks)

# 4. 数値計算
isi = mea.calculator.isi(peaks, ch=2)
print(f"ISI 平均: {isi.mean:.3f} s")

この4ステップが全解析の土台:読み込む → 拾う → 見る → 計算する。

pyMEA コードガイド

チートシート

やりたいこと コード
データ読み込み read_MEA(path, start, end, dist)
ピーク抽出 detect_peak_neg(mea.data)
全波形表示 mea.fig.showAll()
1電極表示 mea.fig.showSingle(ch=N)
ピーク確認 mea.fig.plotPeaks(N, peaks)
ISI計算 mea.calculator.isi(peaks, ch=N)
FPD計算 mea.calculator.fpd(peaks, ch=N)
GIF保存 VideoMEA(frames).save_gif("out.gif")
pyMEA コードガイド

お疲れ様でした!

まずは手元のデータで「読み込み → 表示」から試してみましょう

詳細は README_ja.md を参照してください

pyMEA コードガイド