例題18-2:PsychoPyの設定と公式サンプル

A: さて、今回はPsychoPyのサンプルを見ていこうと思っていたんだが、その前にPsychoPyの各種設定を確認しておこう。まず、BuilderとCoderはメニューの"View"から切り替えることが出来る。

../_images/18-2-01.png

B: すわ、いきなり本題ですか。

A: (無視して)PsychoPyの設定は、メニューの"File"から"Preference"を選ぶ。設定はCoderとBuilderで共通なのでどちらから選んでもよい。

../_images/18-2-02.png

A: で、これがPsychoPyの設定ダイアログだが、2012年9月14日現在の最新バージョン1.74.03だと[general]、[app]、[coder]、[builder]、[connections]の5つのタブがある。まずは[general]から見ていこう。

../_images/18-2-03.png

winType

刺激描画ウィンドウとしてpygameとpygletのどちらを用いるか指定する。メーリングリストではpygameは最近バグが多いのでpygameサポートをやめようかという議論も出ている。

units

PsychoPyで標準で使用する単位をdeg, norm, cm, pixのいずれかから指定する。設定画面のプルダウンメニューには表示されないが他にもhightという単位も使える。詳しくは後述。

fullscr

このチェックがオンにされると刺激描画ウィンドウをフルスクリーン表示する。

allowGUI

このチェックがオフにされると刺激描画ウィンドウの周りに枠を表示せず、マウスカーソルも表示しない。

paths

独自のpythonモジュールを標準ではないディレクトリに置いている場合、ここにパスを書いておくとimportの時に探索してくれる。

B: 最初の項目からわからないんですが、pygletとpygameというのは何が違うんですか?

A: pygameは文字通りゲーム開発のためのパッケージ、pygletはマルチメディアパッケージ。具体的に何が違うかというと…

B: というと?

A: 作ってる人たちが違う。

B: (椅子からずり落ちる)

A: いや、似たような働きをするパッケージなんだが、作る人が違っていて、開発におけるプライオリティが違って、コードの書き方が違う。 実験用途で言うならば、動画再生のサポートは全般的にpygletの方が良好だ。また、マルチディスプレイも私は試したことがないがpygletを使うほうが良好なようだ。

B: 最初からそれを言ってくれればいいのに。

A: 続いてunits。これはVisionEggと比較してPsychoPyの大きな特徴のひとつだ。VisionEggではViewportで何か特殊な設定をしない限り、刺激のサイズとして指定する数値はそのまま画面上でのピクセルに対応する。 すなわち、高さを100とすれば画面上で100pixの大きさで描画される。PsychoPyでは'pix'をunitsとして指定すればVisionEggと同じ動作となる。

B: ふむふむ。

A: これに対して'norm'を指定すると、画面の縦横を[-1,1]にスケーリングする。つまり1024×768のディスプレイでは(0,0)の位置は(-1,-1)、(1024,768)は(1,1)になるわけだな。いや、(1023,767)かな? ソースを読まないとわかんないな。

B: ん? なんで(1023,767)?

A: 横1024ピクセルで0から数えるなら1024番目は1023である。

B: あ、そうか。じゃあ今までディスプレイの中心は幅÷2、高さ÷2ってしてましたけど厳密に言うとずれているんですね?

A: 正直その辺の違いはほとんどの場合実験結果に影響を与えるとは思えないんでスルーしてきた。

B: あ、そういうもんですか。

A: 逆にこの1ピクセルの差で結果が変わる実験があったら教えてほしいな。さて、残りの単位だが、ダラダラ話すのが面倒くさくなったので表にしてみた。 解像度1024×768、ディスプレイの幅30cm、視距離100cmという設定だ。atan()は逆正接関数、piは円周率を表している。

ディスプレイの左下

ディスプレイの右上

VisionEgg

(0,0)

(1023,767)

PsychoPy
'norm'

(-1.0,-1.0)

(1.0,1.0)

PsychoPy
'pix'

(-1024.0/2.0,-768.0/2.0)

(1024.0/2.0,768.0/2.0)

PsychoPy
'cm'

(-30.0/2.0,-30.0/2.0*768.0/1024.0)

(30.0/2.0,30.0/2.0*768.0/1024.0)

PsychoPy
'deg'

(-180.0/pi*atan(30.0/2.0/100.0),
-180.0/pi*atan(30.0/2.0/100.0))

(180.0/pi*atan(30.0/2.0/100.0),
180.0/pi*atan(30.0/2.0/100.0))

PsychoPy
'height'

(-0.5*1024.0/768.0,-0.5)

(0.5*1024.0/768.0,0.5)

B: むむむ…。難しいな。ええと、これがあれで…。

A: degがちょっとわかりにくいかもしれないが、ディスプレイの表示面が平面で、その中心を表示面に垂直に注視していると仮定して計算している。ディスプレイ中心からの距離を視距離で割って逆正接(atan)を求めると視角がラジアンで求められる。180を掛けて円周率で割れば単位がdegになる。

B: ぼくもいい加減そのあたりはわかるようになったんですが…。どの数字がどこに入るのか覚えるのが大変そうだ。

A: 解像度、ディスプレイの幅、視距離は全てMonitor Centerで設定した値をPsychoPyが使ってくれるので、覚える必要はないんだけどね。

B: Monitor Center?

A: おっと、先取りしてしまった。これは後で出てくるが、PsychoPyでは使用するディスプレイの解像度や寸法、視距離、キャリブレーション結果などをMonitor Centerに登録しておくことが出来る。

B: へえ! そりゃ便利そうだ。

A: そうかねえ。私ぁどうも疑り深いので、ピクセル単位で表示して自分で距離や寸法の値を使って計算する方が好きだがねえ。

B: ひねくれ者だなあ。

A: そういうところを自分で確認しないと気が済まないのが研究者の性だと思うがなあ 。まあだいたい見てもらえばわかると思うが、注意すべき点はPsychoPyではディスプレイ中心が(0,0)になるので、例えば'cm'の場合、ディスプレイ幅が30cmなんだから描画範囲は-15cmから15cmになるということ。これがまず一点。

B: ふむふむ。

A: あと、 'cm'はディスプレイ幅、'height'はディスプレイ高さを基準にした単位なので、それぞれ垂直方向、水平方向の描画範囲はディスプレイの縦横比を使って計算してやらないといけない 。1024.0/768.0や768.0/1024.0を掛け算しているのがソレだね。もちろんここには ディスプレイのピクセルは正方形であるという仮定がある ことには注意する必要がある。

B: え、正方形じゃないんですか?

A: 正方形じゃないディスプレイなんていくらでもある。

B: がーん、何だかちょっとショック。

A: CRT時代なんかは調整次第で縦横比を微妙に調整したりも出来たんだぞ。 ちなみに'norm'は実験用と学会発表等のデモ用ディスプレイの解像度が大きく異なっていてもいちいちスクリプトを書きなえないで済むという利点がある。ただし、ディスプレイ間で縦横比が異なると刺激がひずんでしまうし、なにより正方形を描画するのに縦と横の長さとして異なる値を設定する必要がある。例えば1024×768でピクセルが正方形として、横の長さに0.1を指定したとしたら画面上では102.4ピクセルに相当するんだから、縦の長さは102.4÷768=0.133...を指定しなければいけない。

B: 面倒くさーい。

A: 'height'なら'norm'と同じようにディスプレイの解像度によってスケーリングされて、しかも正方形を描くとき横が0.1なら縦も0.1と書ける。

B: なるほど。それで'height'なんてものがわざわざ用意されているんですね。

A: ま、正直な話こんな面倒くさいこと考えるくらいなら最初っから全部ピクセルで描いた方がマシ、ってのが私の個人的な意見だがね。便利だと思う人はいるのだろう。

B: うーむ。

A: まあその辺は「好みだから」でとやかく言うつもりはないんだが、一つだけ文句を言いたい点がある。なんで 'norm'は-1.0から1.0なのに'height'は-0.5から0.5なんだよ!!! どっちかに揃えんかい!!!

B: あー、文句を言いたい気持ちはわかりますが落ち着いてくださいよ。どうどう。

A: はぁはぁ。残りの項目だが、fullscrとallowGUIは問題ないっしょ。pathも自分でオリジナルのモジュールを作るくらいの人なら意味はわかるでしょ。パス。

B: 一気にAさんらしい投げやりな説明になりましたね。あ、もしかしてpathとパスのシャレ?

A: Aさんらしいは余計じゃ。シャレでもないっちゅーの。続いて[app]のタブ。

../_images/18-2-04.png

A: ここはあまり解説することがないのだが…。まずdefaultViewでPsychoPyを起動したときにCoderが立ち上がるのかViewerが立ち上がるのかを指定できる。lastなら前回終了時に開いていたものを復元、bothなら両方開く。

B: それはなんとなくわかります。

A: あとは…と。おっと、重要なものを忘れていた。最後のlocaleはPsychoPyが生成するスクリプトやデータのlocaleを指定する。ちょっと前のバージョンで対策が施されたので問題が生じることが少なくなったが、非英語OSでBuilderを走らせると文字コードの問題でエラーが生じることがある。そういう時に'ja_JP.UTF-8'などと設定するとうまくいく場合がある。 何も設定しなくても問題なく動作している場合は空欄のままにしておくのが良い

B: また文字コードがらみですか。英語圏の人たちはずるいなあ。

A: バージョン1.73くらいの頃だったかなあ。その頃はUbuntu上で文字コードの問題でBuilderが動かなくて文字コードの設定が必要だったんだが、最近のバージョンは特に何も設定しないでも動くようだね。少しずつ進歩している。さて、次行くぞ、次。

../_images/18-2-05.png

B: [coder]タブですね。

A: ここもあまり解説することはないなあ。Coderを使っているときのフォントを指定したりとか。標準でチェックされているのでわざわざいう事でもないんだが、showOutputはチェックしておいた方がいい。これをチェックしておくとCoderの下部にpythonからの出力が表示される。何かエラーが起こった時にここに表示されている出力を見ると問題解決の手がかりが得られることも多い。

B: なるほど。

A: ちょっとわかりにくいのはpreferredShellかな。Coder Viewの下部に[shell]というタブがあって、その中でpythonインタプリタを起動してちょっとした処理が出来るようになっているんだが、その画面で使うインタプリタとしてpyshellとipythonのどちらを使うかを指定できる。まあ特にいじる必要はないでしょ。ちなみに私は別窓でipythonを立ち上げるのでまったく使ったことがない。というかそもそもCoder ViewやBuilder View自体全然使わない。

B: 身もフタもありませんね…

A: 続いて[builder]タブ。ここは私も全然知らない。終了。

B: ちょ、それはいくらなんでもあんまりでしょ。

../_images/18-2-06.png

A: そう言われてもなあ。これでも今回の例題で取り上げるにあたって公式ヘルプを読んだり自分で操作してみたんだぞ? でもこのタブの項目は公式ヘルプに記載すらされていないものも多いし、hiddenComponentsとか試してみたけど設定した値が保存すらされねえ。ソースを見りゃわかるかも知れんがそんなことやってられるかいな。こんなもんは知らん。

B: ひどい言いようですね。

A: ここで貼ってあるのはWindows版でのスクリーンキャプチャなんだがcomponentsFoldersなんかどう見てもWindowsのパスじゃないし、複数OSでの動作テストとかきちんと出来ていないんだろ。まあマルチプラットフォームをきちんとサポートするのはとても大変なことなのであまり厳しいことを言うつもりはない。

B: 十分厳しいような気がしますが…。

A: ま、特定のOSでしか動かないのは構わないんだけど、できればそう書いておいて欲しいってことだよね。無駄な苦労をしなくて済む。まあ触れておく価値があるのはsavedDataFolder。Builderで実験を作成して実行すると、savedDataFolderで指定したディレクトリにデータが保存される。この例だと'data'となっているので、スクリプトが置かれているディレクトリに'data'というディレクトリが作成されてそこにデータが保存される。

B: じゃあ'himitsu'って指定したら?

A: 'himitsu'っていうディレクトリに保存されるが…なんだよそのディレクトリ名は。

B: いや、別に意味はありませんが。

A: …。まあいい。あとalwaysShowReadmeがチェックされていると、スクリプトと一緒にREADME.txtがあったらBuilderで開いた時にREADME.txtを表示してくれる。あまり実験の役には立たないかも知れないが、例えば公式サンプルを開いた時にいちいちREADME.txtが表示されるのが鬱陶しければチェックを外しておけばいい。

B: なるほど。

A: 最後に[connections]だが…。これはallowUsageStatsにチェックを入れているとPsychoPyを起動したときに利用状況を調査するためのデータを開発元に送信する。個人を特定できる情報は送信しないし起動時の遅延もほとんどないので、開発者としては出来ればチェックしておいてほしいということだ。オープンソースなので何の情報を送っているのかはその気になれば簡単に確認できるが、公式ヘルプによると"The info sent is simply a string that gives the date, PsychoPy version and platform info."だそうだ。

B: そんなの集めてどうするんですかね。

A: さあ? あとcheckForUpdatesをしていると最新版のチェックを行う。少し前のバージョンまで自動アップデートの機能もついていたはずなんだが、個人的な経験ではまともに動作した試しがないな。

B: あらら。

A: あとはインターネット接続にproxyの設定が必要な場合はproxyに設定を書いておけばいいようだな。これは私は使ったことがない。いちいちこれの確認のためにproxyを使う気にもなれないし。

../_images/18-2-07.png

A: さて、設定画面の説明はこのくらいにしておいて、最後に先程ちらっと出てきたMonitor Centerの解説をしておこう。Monitor Centerはメニューの"tools"から起動する。こんな感じだ。

../_images/18-2-08.png

B: おお、何だか知らないけど格好いい。

A: 画面左上が登録されているモニターの一覧。ここでは標準でインストールされているtestMonitorというモニターだけが表示されている。新しくモニターを登録する場合は"New..."、変更を保存する場合は"Save"。削除する場合は"Delete"。

B: そりゃ言われなくても想像がつきますが。ていうかそうじゃなかったらびっくり。

A: で、左下のMonitor Infoがさっきのunitsと関係している。unitsに'cm'や'deg'を設定した場合、ここに登録されている値を使って刺激の大きさを決定する。

B: ふむふむ。なるほど。Use Bits++っていうのは?

A: Cambridge Research SystemsのBits++を使う場合はチェックするんだろう。私はBits++を持ってないんで確かめようがない。誰か持っている人は確かめてください。

B: お高いんですか

A: 視知覚を研究している有力ラボならその辺に転がっているものだが、私のような貧乏研究者にとっては高根の花だ。それ以上聞くな。

B: あ、じゃあやめときます。

A: で、画面右側だが…。こちらではモニターのキャリブレーションを行う。PsychoPyが対応している輝度計を持って入れば、輝度計を接続してGet Photometerを選択してGamma Calibration...をすればキャリブレーションが行われる。例によって私ぁ対応する輝度計を持ってないので試したことはない。以上。

B: えーと、これまた例によってですが、お高いんですか?

A: これまた例によって以下省略。

B: …わかりました。じゃ、この話題はこれで。

A: PsychoPyが対応する輝度計を持っていない場合は、Linearisationの欄にここにこつこつと値を入力すればキャリブレーションできる。

B: どういう値を入れていけばいいんですか?

A: 輝度計があって、こんなキャリブレーションをしないといけないような研究をしているラボに所属しているんなら、ラボの先輩や先生に聞いた方がいいに決まっとる。というわけでパス。

B: もはやお決まりのパターンですね。

A: んじゃ、次回はCoderをいじっていくというか、VisionEggの時と同じようにテキストエディタで直接スクリプトを書いてみよう。唐突だが、今回はここまで。

B: へーい。