生物と計算機のあいだ

個人的にうまくいったかなとおもったことを書いています。うまくいかなかったらごめんなさい。

BeanshellでMicro-managerを動かす

大学院生時代の研究室では顕微鏡の操作にMetaMorphという商用のソフトウェアを使っていた。現在、ポスドクをしている研究室ではMicro-Managerというソフトウェアを使って顕微鏡を動かしている。画像解析でよく広く使わているImageJの顕微鏡制御用プラグインといった感じだろうか、Micro-Managerを立ち上げるとImageJも同時に立ち上がる。研究を進めていくうえで、ソフトウェアで予め用意されているMulti-Dimensional Acquisition (MDA) ではカバーできない操作をする必要が出てきたので、自分用にカスタマイズしたMDAを作ってみた。その過程で得られたTipsを備忘録として書き残したい。

MetaMorphにはJournalというプログラミング風な機能が実装されており、ソフトウェアで提供されているメソッドをGUIでグリグリ指定することで、顕微鏡の動作をカスタマイズできる。一方で、Micro-Managerでは公開されているAPIにアクセスしてプログラミングをすることで、自分好みの挙動を実装しなくてはいけない。公式のドキュメントによると使用可能な言語はBeanshell (Javaインタプリタ型?), MATLAB, Pythonの3言語をサポートしているらしい。Beanshellは過去の遺物になっている感が否めなかったが、Micro-Manager本体にエディタが付属していたのでこちらを使ってみることにした。

読んでよかった資料

Micro-Managerを使用すること自体に慣れていなかったので、まずは公式が出している記事やドキュメントをちゃんと読むことにした。

プログラミングガイド

これのおかげでなんとなくどういうことが可能かを理解できた気がする。ただ、ここに載っているサンプルコードはJavaユーザー向けにかかれているようで、Beanshellでは使うことができない。
Micro-Manager Programming Guide - Micro-Manager

SourceForgeのMicro-managerのページ

Mailing listのタブから利用者からの質問と開発者からの回答が読める。いまいち自分が知りたい情報にアクセスするのが難しい気がする。下記2つのドキュメントをちゃんと読もうという気にさせてくれた。
sourceforge.net

Micro-Managerを動かすために必要な基本的な関数たち

いわゆるドキュメント。命名規則がしっかりしているので、やりたいことに対応する単語がちゃんとイメージできれば知らない関数でも見つけるのはあまり難しくない。ここにある関数は"mmc.関数名"で呼び出せる。
CMMCore

Micro-managerのGUIに関する機能を使うために必要な関数たち

GUIにあるパラメータや撮影ポジションを登録するウィンドウから情報を取得する時に使った。ここで実装されているメソッドは"gui.関数名"で呼び出せる。
ScriptInterface

サンプルコード

これまでに実装されていたコードが公開されている。しかし、バージョンの変更に伴う仕様の違いなのか、コピペプログラミングをしようとするとそこそこエラーに遭遇する。笑 ただ雰囲気を掴むためには非常に有用だった。とくに1つ目のリンクは選抜されたコードのようなので、一通り読んだ。
Example Beanshell scripts - Micro-Manager
scripts – Micro-Manager
この中でも、"acqLC.bsh"と"Burst.bsh"は自分でMDAを実装をする上でとても参考になった。

実装していった中での学び

サンプルコードにある方法ではクラスをインポートできない。APIが整理されており、それに伴って呼び出し方が変更されている。パスが変更されているのは
Micro-managerのSourceForgeメーリスで言及されているのをたまたま見つけて知った。

)
import org.micromanager.navigation.PositionList;
import org.micromanager.navigation.MultiStagePosition;
import org.micromanager.navigation.StagePosition;

正)
import org.micromanager.api.PositionList;
import org.micromanager.api.MultiStagePosition;
import org.micromanager.api.StagePosition;

CMMCoreにあるメソッドはimportしなくても呼び出すことができる。使うことが前提だからなのかスクリプトの最初で宣言する必要がない。これに関しては特別言及されていなかったような気がする。サンプルコードからその雰囲気を感じ取った。

mmc.xxx; // このような形式でアクセスできる。

撮影した画像のセーブなどはMicro-managerの関数ではなく、ImageJで用意されている関数を使用する必要がある。機器制御はMicro-manager, 画像はImageJと役割分担がきっちりしているので、一度このことを知れば関数探しに手間取ることもないだろう。ImageJの関数を使うためには以下のような感じでImageJの関数群を予め呼び出しておく必要がある。ImageJの関数は画像をtiffとして保存することにしか使わなかったが、うまいこと組み合わせれば撮影と同時に解析して逐次定量データをテキストファイルに保存することなどもできそう。

import ij.process.*;
import ij.ImagePlus;
import ij.io.FileSaver;

完全に理解できているわけではないが、この辺のMicro-managerを動かすために必要な前提知識さえ手に入れてしまえば、その後のプログラミング自体は (他の言語での経験があれば) 全然難しくないと思う。Micro-managerに関する日本語の情報は名大の塚田さんが日本語訳のページを用意してくださっていたりするが、自分で動かす系の記事が思いの外見当たらなかったので、誰かの助けになったら嬉しい。