2014年4月11日金曜日

ORIGINの便利な技を紹介していくよ (未完)

今日はOriginLabのデータ分析・グラフ作成ソフトウェアのOriginの便利な使い方を紹介します。
ちなみに私が使っているのはver. 9.0.0Jということです。

Origin派とIgor派がいると思うんだけど、なんで私がOriginを使っているかというと、たまたまそこにあったからです。もうかれこれ7年位使ってます。

段々こなれてくると、同時に10個とか20個とかのデータをグラフにしたくなってくる場面があると思います。5個くらいまでなら手動でワークブックでX列とY列を選択肢して、作図。XYのスケールをそれぞれ変えて、線の太さや色を変えて、余白を設定して、グラフ全体の大きさを調節して、みたいなルーチンを行うわけです。

そうルーチン。ルーチンワークなら必ず全自動化できると考えるくせを付けたほうが良いです。

そこで今日私が紹介するのは、その名も「カスタムルーチン」です。


////////////////////////////////////////////////////////////////////////////////
// Main Code
////////////////////////////////////////////////////////////////////////////////

[Main]
aa$ = "Graph";
dd$ = "Book";
ff$ = "Layer";


// make line graph
loop(ii,9,16)
{
bb$ = $(ii);
cc$ = aa$+""+bb$;
cc$=;
ee$ = dd$+""+bb$;
ee$=;

layer.unit=1;
cc$!layer.left=10;
cc$!layer.top=10;
cc$!layer.width=80;
cc$!layer.height=80;


cc$!layer.x.from=0;
cc$!layer.x.to=270;
cc$!layer.x.inc=60;
//cc$!layer.y.from=-2.5;
//cc$!layer.y.to=5;
//cc$!layer.y.inc=5;

cc$!layer.showLabel=0;
cc$!layer.showData=1;

cc$!layer.showx=1;
cc$!layer.showy=1;

//cc$!legend.show=0;

range rGraph = [cc$];
rGraph.unit= 4;
rGraph.width = 5120;
rGraph.height = 2560;


}










plotxy iy:=[ee$]Sheet1!(1,2) color:=2 plot:=200 ogl:=[cc$];
//range rGraph = [cc$]Layer1!1;
//set rGraph -w 100;
loop(j,3,20)
{
plotxy iy:=[ee$]Sheet1!(1,$(j)) color:=19 plot:=200 ogl:=[cc$];
//range rGraph = [cc$]Layer1!$(j);
//set rGraph -w 100;
}


//page.unit = 1;
//cc$!page.width=36000;
//cc$!page.height=6000;






*/


//make graph 5120x5120 pixels


/*
range rGraph = [cc$];
rGraph.unit= 4;
rGraph.width = 5120;
rGraph.height = 5120;

cc$!layer.x.from=1.5;
cc$!layer.x.to=9.5;
cc$!layer.x.inc=1;
cc$!layer.y.from=9.5;
cc$!layer.y.to=1.5;

layer.unit=1;
cc$!layer.left=0;
cc$!layer.top=0;
cc$!layer.width=100;
cc$!layer.height=100;
*/

2014年2月27日木曜日

浜松ホトニクスのHC Imageのスケジューラ機能を使ってみた

基本的な理解が2点ある。

一点目。
蛍光イメージングをするんだけれども、励起光を照射してシグナルを得るわけ。
この励起光というのは細胞にとって毒性があるし、長いこと照射していると得られるシグナルが弱くなってしまいます (退色)。だからあんまり長いこと励起光を照射したくないわけです。

二点目。
得られるシグナルというのはノイズに比べて微弱なことが多い。そのため、加算平均 (アンサンブル平均)を行って、シグナルのみを増強し、ノイズレベルを落とす必要がある。
大前提として、脳は同じ入力に対してはほぼ同様に出力すると考えている。だから、50回とか同じ刺激を行ってそれを全部足し算して平均を出せば、刺激に対する平均的な応答が得られると考えて良いわけ。

50回とか連続して記録する必要があるのだけど、しかしながら、その間ずっと励起光を照射していると光毒性や退色によって均質なデータが得られないという問題が生じるわけです。

しかも一回刺激をしたら、定常状態に戻るまで待つ必要があるわけです。この間励起光の照射は必要ないわけです。

そこで前回 (浜松ホトニクスの新しいイメージングソフト (HC Image)をインストールしてみたの巻)で導入したように、光源のオン・オフをソフト上で外部刺激装置によって制御できるようにする必要があったわけです。

ここで、やろうと思っている刺激と記録と照射のタイミングは、文章にするとだいたい以下の通り。

(1) トリガ待ち (2) 光源ON (3) 記録始まる (刺激前、刺激中、刺激後) (4) 記録終わる (5) 光源オフ (6) 待つ →  (1)に戻る

これを50回繰り返せば良い。
この内、光源ON/OFFと記録開始のトリガによる制御は前回導入した通り、有償版のHC Imageによって達成できたわけです。

問題は 「(1)に戻る」の部分で、記録が一回終わったらもう一回トリガ待ちの状態に戻って欲しいわけ。そこで、浜松ホトニクスの有償版 HC Imageに搭載されている「スケジューラ機能」が必要となるわけです。


使い方は簡単でUse Schedularにチェックを入れると下記画像みたいになるので、Loop回数を決めて、一回のループ内容を決めれば良いのです。システム上、記録開始と光源のオン・オフが同期するということなので、一回目のパルスで光源オンと記録を行い、二回目のパルスで光源のオフを行います。どちらもタスクが終わるとトリガ待ちの状態に勝手になるので、あとは外部装置の設定で、記録終了後に2発目のパルスを即座に入れてやると光源が切れます。

Scan settingsの方は、ループのファイルをHC Image専用の.CXDファイルとして保存するか、.TIFF画像で保存するか、それをループ全体を一つのファイルとするか、ループごとにファイルを分けるか、という選択ができます。

それぞれのタスクごとに、ローカルディスクに保存するか、メモリに一旦格納してから終了後にディスクに書き込むかという選択ができます (右図)。

私の目論見では、一回のループでメモリに情報を蓄えて、次のループの待ち時間にメモリをディスクに保存してメモリを解放して欲しかったのですが、現状は、ループが全部終わるまでメモリを解放してくれません。
かと言って、いちいちローカルに保存しているとフレームレートが処理落ちします。まじ最悪です。

この点は浜松ホトニクスに改善を要求したいです!

うちのPCでは512x512画像は11714フレームまでしかメモリに格納しておけないわけです。本当は100fpsで高速にイメージングしたいのだが、この問題のためにフレームレートを下げるしかない。
仕方ない。

というわけで、30fpsで20秒間、16回ループをして全部で9600フレームの512x512画像が取得できました。

さて、加算平均するためには、刺激のオンセットが合ってないといけませんね。
そこで、テストとしてLEDを一回フラッシュさせる刺激を上記のループで16回イメージングしてみました。その結果が右画像なわけですが、キレイにオンセット合ってますね。
これでオートマティックに加算平均を行うことができます。


今回私は、記録と露光のON/OFFのループをソフトウエアを介して市販の外部トリガ装置を使って制御する装置を構築しました。
この機能はかなり便利で、原理上は僕の先輩がやっているように、24時間毎に1時間だけ露光して記録してというのを1週間行う、ということも可能なわけです (まぁそのためには外部トリガ装置をLabViewで組む必要があるけど、きっと数時間で出来ると思う)。

うちの大学の研究室なら前回と今回の内容で卒論になるね!笑



2014年2月18日火曜日

Labviewで任意の周波数の音のパルス幅を外部トリガーで駆動するソフトを作ってみたよ

皆様

任意の周波数 (音程)で最大20Hzくらいの間隔で音刺激をできるLabviewソフトを唐突に作ってみました。
ご自由にご利用下さいませ。




MASTER-9からDAQにパルスを入れてパルスに追随する形で音を出せます。
ピーピーピーもピピピピピピも行けます。

発想としては音量ゼロでずっと音を出しておいて、パルスがきた時だけ波形の振幅を1にするという感じです。

MASTER-9からは自発的に0-1の間の電位が発生しているので、閾値を決めてそれ以上の値がきたら音を出すというふうにします。
波形チャートにはその結果が波形として出力されます (なくてもいいけど)

MASTER-9から出力されるパルスは設定上の10Vで実質大体5Vくらいみたいです。
なので閾値は4くらいに設定しておくと安心みたいです。
サンプル数をもっと下げるともうちょっと高速のパルス幅で音が出せるかも知れないです。
ちょっとこのへんの関係がまだよく解ってません。

10回パルスの内1回だけ音の高さを変えるとかはまだできないので、そのうち改良します。

Sound discrimination task (GO/No GO)みたいなのができたらいいですね。

もうない

2014年2月17日月曜日

浜松ホトニクスの新しいイメージングソフト (HC Image)をインストールしてみたの巻

今回は浜松ホトニクスのイメージングソフトウエア HC Imageのインストールから設定までの記録を残しておく。

浜松ホトニクスのイメージングソフトウエアといえばAQUA COSMOSが有名だが、開発は日本が主導で、30-15年くらい前に一世を風靡したスライス培養や急性スライスのイメージングに特化したものであるらしい。たぶん私の指導教授も開発には大いに貢献したに違いない。

ところがあまりにもガラパゴス化したためにもっと汎用性のあるものを、ということで開発されているのがこのHC Imageで、
これはアメリカとヨーロッパと日本の共同開発であるらしい。一番の売りはなんと言っても64bitシステムで動くことか。

無償版はHC Image Liveといって、無償でこれだけの機能があるのかというくらい非常によくできたソフトでした。今回は実験の都合上、欲しい機能が付加された有償版を購入しました。

今回インストールしたPCはwindows 7 64bit版です。

1. インストールへの道のり

有償版はUSBドングルがないと動かないのですが、これを認識するのがSentinel Protectionというシステムらしい。調べた感じ、これは浜ホトに限った話じゃなくて一般的に有償のソフトウエアをプロテクトするのに用いられているみたい。

HC Imageをインストールすると途中でSentinel Protection Installerというのをインストールすることになる。私の場合、まずここで躓いた。

おそらく大半の初購入者は失敗することはないと思うが、Sentinel Protection Installerでググルと、「Sentinel Protection Installer インストールできない」とか「Sentinel Protection Installer エラー」と予測検索されるので、HC Imageにかかわらず失敗する人が多いのだろう。

なのでまずはここにその対策を記す。

私の場合は何度試しても「your system has not been modified」というエラーメッセージが出る。これは要するにインストールに失敗したということなのだが、考えられる原因は2つあって、(1) インストール先のフォルダーのパーミッション権限がないために拒否される (2) 古いバージョンが残っている、ということだ。

(1) 普通は管理者でログインしていると思うが、複数の人でPCをシェアしてる場合などは権限が限定されている場合もあるので、インストール先のフォルダー (なぜか/Program Files (x86)/Common Files)を右クリックして権限を確かめる、というのが一点。

(2) トラブルシューティングにある通り、
http://support.safenet-inc.jp/srm/information/faq/SuperPro_TS_FAQ_20120221.pdf
古いバージョンのレジストリなんかが残っているとダメらしくて、せっせと消したんだけどダメ。
たぶん初めてインストールする人はないと思うけど、以前業者の方に有償版をデモしてもらったときに残ったゴミが邪魔してるっぽい。

そんな人は、Sentinel System Driver cleanup の64bit版をダウンロードして実行すると良い。
http://sentineldiscussion.safenet-inc.com/topic/cleanup-utility-ssdcleanup

どちらが功を奏したのかは判らないが、とにかくうまくいった。丸二日かかったよ。

2. 外部装置との接続

前述で実験の都合でと書いたが、今回私がしたかったのは、(1) 光源の制御を外部トリガーで行うこと (2) 測定のルーチン化 (スケジューラー機能)の二つでこれは無償版ではできない。(2)はまた後日行うとして、まずは (1)について記す。

用いる外部刺激装置はAMPIのMaster9 (いわゆるスティミュレーター)、制御したい光源はLeicaのEL6000。
この機械はシリアルポート接続でトリガーを入れることができることは知っていたので、HC imageのI/O outputからシリアルポート出力を行えばよい。つまりソフトウエアを介して二つのハードウエアを制御するということだ。
このように多彩な外部機器との接続を可能としている点もHC Imageの利点である。おそらくどんな顕微鏡やフィルター・シャッター・光源・XYステージなどの外部装置もサポートされていると思われる。

用意するものは、(拡張) シリアルポート、9pinのオス-メス シリアルケーブル

次に、PCにトリガを入力し、ソフトウエアを制御する。ここで用いるトリガ制御ユニットは浜ホト純正のものを購入した。出力は後半の4チャネルで今回は6番- PIN15のNerrorを用いた。ここに外部刺激装置からの入力をBNCケーブルで接続する。

用意するものは、(拡張) プリンタポート、25pinのオス-オス パラレルケーブル

トリガ制御ユニットのoutからPCに接続。

これで準備完了。PCを介して、光源と刺激装置がつながりました。



3. HC Imageの設定

まずは、file→current profileからDevice settingのタブへ、I/O Devicesでadd、新しい接続を開始します。 (1) 一端はSerial-IO: COM4で、光源の4pinをCOM portとして選択 (これは光源装置の仕様)、それ以外はデフォルトで、光源のシャッターは切っておく。これで光源の制御がシャッターの開閉と同期します。 (2) もう一端はParallel- IO:LPT1でP15-nError がActiveなのを確認すればOK。




































LPT1とCOM4がactiveになっていれば良い。

次にTOPパネルのDeveicesからI/O setupを選択 Capture EventsのタブでInput PinsをP15に、stateはHighに
Frequencyはfirst fieldにしておけばよい。一方outputはExposure onをCOM4のPin4のhighを選択しておけばよい。

以上。明日は (2) スケジューリング機能の設定を頑張るよ。

2014年1月30日木曜日

ImageJのROIをmatlabで読み込む方法。

2014.Jan.30
 ImageJで作ったROIをmatlabに読み込む関数は以下のリンクから得ることができます。

http://www.dylan-muir.com/articles/read_ij_roi/
http://www.mathworks.com/matlabcentral/fileexchange/32479-import-imagej-rois

[sROI] = ReadImageJROI(RoiSetFile); 

使い方は簡単で、RoiSetFileに'.roi'ファイルかまたは'.zip'ファイルのフルパスを入力すれば読み込めます。
.zipの場合はセルを自動で作ってその中に全roi情報が格納されるようです。

セルの中に、mnCoordinatesという項目があってそこに、x座標とy座標の情報が登録されています。よって、

       xv = sROI{1,m}.mnCoordinates(:,1);
      yv = sROI{1,m}.mnCoordinates(:,2);

とすれば、m番目のROIの座標情報が取得できます。

 さて、問題は、取得できる情報は輪郭だけなので、囲んだ内部の情報が得たい場合は少し工夫が必要なようです。

今回は愚直に、512x512全ピクセルをスキャンして、その輪郭の内部にあるかないかを判定する関数、inpolygonを用いました。

あまり賢い方法とは言えないですが、これなら確実にROIの内部の座標が全部、indexに返ってきます。

indexの情報は新たに作ったROIindexというセルに全部放り込んで、後で取り出せるようにしておきます。

何かもっといい方法があったら教えて下さい。

例) 512x512画像の場合

function [ROIindex,numROI] = ReadROIindex(RoiSetFile)
% RoiSetFile = '0044-0257-0253.roi'
% RoiSetFile = 'RoiSet.zip'

    [sROI] = ReadImageJROI(RoiSetFile);
    numROI = size(sROI,2);
    ROIindex = cell([1,numROI]);

    for m = 1:numROI
        xv = sROI{1,m}.mnCoordinates(:,1);
        yv = sROI{1,m}.mnCoordinates(:,2);
        index = [];

        for x = 1:512
            for y = 1:512
                B = (x-1).*512+y;
                in = inpolygon(x,y,xv,yv);
                if in == 1
                   index = cat(1,index,B);
                end
            end
        end
        ROIindex{1,m} = index;      
    end
 
end