Imported from kkito0726/MEA_modules (
.claude/skills/pyMEA-codegen/SKILL.md). Install upstream withnpx skills add kkito0726/MEA_modules --skill pyMEA-codegen. Copyright stays with the author.
pyMEA コード生成スキル
pyMEAライブラリを使った解析コードをJupyter Notebook上で生成するためのガイド。 ユーザーは研究者(プログラミング経験は様々)で、pyMEAはインストール済み。
詳細なAPIリファレンス: 各メソッドの全パラメータや型情報は references/api-reference.md を参照すること。パラメータの詳細やあまり使われない機能(バースト解析、ポワンカレプロット、アーティファクト除去等)について質問があった場合は、まずリファレンスを確認する。
基本原則
from pyMEA import *を使う — これが標準的なimport方法- イミュータブル設計を尊重する — データ変換は常に新しい変数に代入する
- 電極番号は1〜64 —
array[0]は時間データ、array[1]〜array[64]が電極データ - コメントは日本語で書く — ユーザーは日本語話者
アーキテクチャ理解
PyMEA (frozen dataclass) — read_MEA() で生成
├── data: MEA # 電位データ(array[0]=時刻, array[1-64]=電極)
├── fig: FigMEA # グラフ描画メソッド群
├── calculator: Calculator # 数値計算メソッド群
└── electrode: Electrode # 電極位置情報
コード生成テンプレート
1. データ読み込み(必ず最初に行う)
from pyMEA import *
# .hedファイルのパスを指定
hed_path = "path/to/your_data.hed"
start, end = 0, 30 # 読み込み期間 (秒)
electrode_distance = 450 # 電極間距離 (μm)
mea = read_MEA(hed_path, start, end, electrode_distance)
.hedファイルの読み込みには、同じディレクトリに同名の.bioファイルが必要。ユーザーが指定した.hedファイルに対応する.bioファイルが存在するか不明な場合(特にファイルパスが初めて提示された場合)、コード生成前に.bioファイルの存在を確認し、存在しなければユーザーに報告して対応を確認する。
デフォルトは生データ読み込み(FilterType.NONE)。ユーザーから明示的にフィルター指定があった場合のみ filter_type 引数を追加する:
FilterType.CARDIO_AVE_WAVE— 心筋細胞の平均波形(ユーザーが「平均波形」「ave wave」等を指定した場合)FilterType.FILTER_MEA— 神経細胞用の移動平均フィルタ(ユーザーが「移動平均」「フィルター」等を指定した場合)
# ユーザーがフィルターを指定した場合のみ使用
mea = read_MEA(hed_path, start, end, electrode_distance, FilterType.CARDIO_AVE_WAVE)
mea = read_MEA(hed_path, start, end, electrode_distance, FilterType.FILTER_MEA)
2. ピーク検出
# 下ピーク検出(心筋細胞で最も一般的)
peak_index = detect_peak_neg(mea.data)
# 上ピーク検出
peak_index_pos = detect_peak_pos(mea.data)
# 上下両方のピーク検出
peak_index_all = detect_peak_all(mea.data)
パラメータ調整が必要な場合:
distance— ピーク間の最小間隔(フレーム数、デフォルト3000)threshold— SD倍率の閾値(デフォルト3)min_amp— 最小振幅の閾値(μV、デフォルト10)
3. グラフ描画
全64電極の波形表示
mea.fig.showAll(start=0, end=1, volt_min=-300, volt_max=300)
単一電極の波形表示
mea.fig.showSingle(ch=6, start=0, end=1, volt_min=-300, volt_max=300)
ピーク位置をプロット
peak_index = detect_peak_neg(mea.data)
mea.fig.plotPeaks(6, peak_index, start=0, end=1)
波形の積み上げ表示
eles = [1, 2, 3, 4, 5, 6, 7, 8] # 表示する電極リスト
mea.fig.showDetection(eles=eles, start=0, end=1)
ラスタープロット
peak_index = detect_peak_neg(mea.data)
eles = [1, 2, 3, 4, 5, 6, 7, 8]
mea.fig.raster_plot(peak_index=peak_index, eles=eles, start=0, end=5)
ヒストグラム
peak_index = detect_peak_neg(mea.data)
eles = [1, 2, 3, 4, 5, 6, 7, 8]
mea.fig.mkHist(peak_index=peak_index, eles=eles, start=0, end=5)
2Dカラーマップ(興奮伝播の可視化)
peak_index = detect_peak_neg(mea.data)
mea.fig.draw_2d(peak_index=peak_index)
# 等高線表示 + 速度ベクトルなし
mea.fig.draw_2d(peak_index=peak_index, contour=True, isQuiver=False)
# カラーマップの変更、基準電極を指定して拍動ごとに分割
mea.fig.draw_2d(peak_index=peak_index, cmap="viridis", base_ch=5)
3Dカラーマップ
peak_index = detect_peak_neg(mea.data)
mea.fig.draw_3d(peak_index=peak_index)
ライン状ネットワークのカラーマップ
peak_index = detect_peak_neg(mea.data)
amc_chs = [1, 2, 3, 4, 5, 6, 7, 8] # AMC電極の順番(経路がつながっている順)
mea.fig.draw_line_conduction(peak_index=peak_index, amc_chs=amc_chs)
# 環状でない経路、基準電極を指定する場合
mea.fig.draw_line_conduction(peak_index=peak_index, amc_chs=amc_chs, isLoop=False, base_ch=1)
注意: base_ch を指定する場合、amc_chs に含まれる電極を指定すること。
4. 数値計算
ISI(拍動間隔)
peak_index = detect_peak_neg(mea.data)
isi = mea.calculator.isi(peak_index, ch=6)
# 統計値の取得
print(f"平均: {isi.mean:.4f} s")
print(f"標準偏差: {isi.std:.4f} s")
print(f"標準誤差: {isi.se:.4f} s")
print(f"STV: {isi.stv:.4f}")
print(f"変動係数: {isi.coefficient_of_variation:.4f}")
# ISIのグラフ表示
isi.show()
FPD(細胞外電位継続時間)
peak_index = detect_peak_neg(mea.data)
fpd = mea.calculator.fpd(peak_index, ch=6)
print(f"平均: {fpd.mean:.4f} s")
print(f"標準偏差: {fpd.std:.4f} s")
# FPD算出に使用したピークの確認
fpd.show()
FPDの検出がうまくいかない場合のパラメータ調整:
fpd = mea.calculator.fpd(
peak_index, ch=6,
peak_range=(30, 110), # 2ndピークの電位範囲 (μV)
stroke_time=0.02, # 1stピーク付近の除外時間 (s)
fpd_range=(0.1, 0.4), # 許容するFPDの範囲 (s)
)
伝導速度
peak_index = detect_peak_neg(mea.data)
cv = mea.calculator.conduction_velocity(peak_index, ch1=9, ch2=54)
print(f"平均伝導速度: {cv.mean:.4f} m/s")
注意: ch1とch2のピーク検出数が一致しない場合、ValueErrorが発生する。ピーク検出パラメータの調整が必要になることがある。
速度ベクトルからの伝導速度
peak_index = detect_peak_neg(mea.data)
gv = mea.calculator.gradient_velocity(peak_index)
電極間距離
dist = mea.calculator.distance(ch1=9, ch2=54)
print(f"電極間距離: {dist:.1f} μm")
5. データ操作
時間範囲の切り出し
mea_slice = mea.from_slice(0.5, 1.5) # 0.5〜1.5秒を切り出し
拍動周期ごとの分割
peak_index = detect_peak_neg(mea.data)
mea_list = mea.from_beat_cycles(peak_index, base_ch=5)
# mea_list[0], mea_list[1], ... で各拍動周期にアクセス
時刻を0始まりにリセット
mea = mea.init_time()
ダウンサンプリング
mea_down = mea.down_sampling(10) # 1/10にダウンサンプリング
ノッチフィルタ(電源ノイズ除去)
mea_filtered = mea.iirnotch_filter(filter_hz=50, Q=30)
6. 動画作成
isBuf=True で画像を取得し、VideoMEA で動画化
# 64電極波形のスライド動画
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.display_gif(duration=0.1) # Jupyter上で再生
video.save_gif("output.gif", duration=0.1) # ファイル保存
カラーマップの動画(拍動ごとに自動生成)
peak_index = detect_peak_neg(mea.data)
video = mea.fig.draw_2d(peak_index=peak_index, isBuf=True)
video.display_gif(duration=0.1)
video.save_gif("colormap.gif", duration=0.1)
7. 周波数解析
mea.fig.plot_spectrum(ch=6, max_freq=500)
8. バースト解析(神経細胞用)
バースト解析モジュールは from pyMEA import * ではインポートされない。明示的にインポートする。
from pyMEA.domain.service.burst import sbf_detection, sbf_single
# 64電極の同期バースト発火検出
peak_index = detect_peak_neg(mea.data)
bursts = sbf_detection(mea.data, peak_index)
# 1電極のバースト発火検出
bursts_single = sbf_single(mea.data, peak_index, ch=6)
パラメータの詳細は references/api-reference.md の「バースト解析」セクションを参照。
9. 画像の保存
# isBuf=True で画像オブジェクトを取得し、ファイルに保存
fig_image = mea.fig.showAll(isBuf=True)
fig_image.save("output.png") # .png, .jpg, .jpeg に対応
# MP4動画の保存
video = mea.fig.draw_2d(peak_index=peak_index, isBuf=True)
video.save_mp4("output.mp4", fps=10)
10. データ情報の確認
# MEAデータの基本情報を表示
mea.data.info
# => 読み込み開始時間, 終了時間, 合計時間, サンプリングレート, GAIN
# データの形状
print(mea.data.shape) # (65, フレーム数)
# 電極座標の取得
x, y = mea.electrode.get_coordinate(ch=6)
よくある解析フロー
心筋細胞の基本解析
データ読み込み → ピーク検出 → ISI/FPD計算 → 波形表示 → カラーマップ
神経細胞の基本解析
データ読み込み(FilterType.FILTER_MEA) → ピーク検出 → ラスタープロット → ヒストグラム
伝導速度解析
データ読み込み → ピーク検出 → conduction_velocity or gradient_velocity → 2Dカラーマップ
コード生成時の注意点
曖昧な情報は必ずユーザーに確認する(最重要)
以下の情報がユーザーの指示に含まれていない場合、勝手にデフォルト値を使わず必ずユーザーに質問する:
- 電極番号(ch) — どの電極で解析するか。誤った電極で解析すると結果が無意味になるため、推測しない
- 解析期間(start, end) — 何秒から何秒までのデータを使うか
- ファイルパス — .hedファイルの場所
- 電極間距離 — 実験条件に依存するため確認する
- 電極リスト(eles) — ラスタープロットやヒストグラム等で使う電極の一覧
- 伝導速度のch1, ch2 — どの電極間で計算するか
- .bioファイルの存在 —
.hedファイルのパスが指定されたら、同じディレクトリに同名の.bioファイルが存在するか確認する。.bioファイルが見つからない場合は、コード生成前にユーザーに「.bioファイルが見つかりませんが、同じディレクトリに配置されていますか?」と確認する
その他、ユーザーの意図が曖昧な場合は常にコードを生成する前に確認する。想定と異なるプログラムが出来上がることを防ぐため、推測よりも質問を優先する。
その他の注意点
isBuf=False(デフォルト)はJupyter上にグラフを直接表示する — 通常はこれで良い- 画像を変数に保存したい場合やGIF動画を作る場合は
isBuf=Trueを使う - 計算結果オブジェクト(ISI, FPD, ConductionVelocity)は
.valuesで生のNumPy配列にアクセスできる plotPeaksのpeak_indexesは可変長引数。複数のPeaks64を渡せる- 色のカスタマイズは
color引数で指定可能(文字列 or RGBAリスト)