例題20-1:チュートリアルワークショップ@JPA77ご報告

A: えー。すでに一か月以上経過してしまいましたが、去る2013年9月19日に日本心理学会で「心理学研究のための Python 活用法」というチュートリアルワークショップが行われました。その際に実施したアンケートの結果報告をもって例題20とさせていただきたいと思います。

B: わー。ぱちぱちぱちぱち… って、なんかテンション低いですね。

A: ん。Sの置手紙がここにある。

B: お、置手紙?

日本心理学会チュートリアルワークショップ「心理学研究のための Python 活用法」に参加していただいた皆様、ありがとうございました。 また、予想以上に多くの方から、チュートリアルワークショップが早々に定員に達してしまったため申込みできなかったと伺いました。申し訳ございませんでした。

今回は「広く、浅く」話をさせていただいたのですが、終了して「参加者はノートPC持参、テーマは『測定機器とのデータ入出力』、プログラミング経験者のみ」と言った具合に条件を絞って深く掘り下げた方が良かったのではないかという感想を持ちました。今後、またこのようなチュートリアルを企画する際の参考にさせていただきたいと思います。

愛媛大学 十河宏行

B: んー。特になんということはない内容に思いますが。

A: もっとうまいやりようがあったんじゃないかってずいぶん気にしてたな。ま、Sはあーゆー奴なんで静かに放置してやるのが良いよ。で、繰り返しになるけどチュートリアルで配ったアンケートの結果をまとめたものを預かっている。まず、参加していただいた皆さんのプログラミング経験について。

  1. Python以外の言語でのプログラミング経験がある

15名

  1. Pythonでプログラミング経験があるが、それ以外の言語は経験がない

1名

  1. プログラミングの経験はほとんどない

3名

19名

B: ほとんどが経験者の方ですね。んじゃもっと他言語でのプログラミング経験者向けの情報発信をしていかないといけないという事ですかね。

A: うむ。Sの置手紙にもあったように定員オーバーで申込みできなかった方もおられたので、潜在的な読者はもっとプログラミング経験の少ない方が多いかもしれない。まあSによると「申込みできなかった」と言っておられた方々はほとんど他言語でのプログラミング経験者だったということだが。

B: なるほど。

A: 続いてA.と回答された方がどのような言語を使っているか。2名以上回答があったものに限る。

Matlab

7名

C/C++

7名

VisualBasic

6名

R

3名

B: やはりMatlabですか。案外C/C++を使われる方が多いんですね。

A: うむ。それにVisual Basicもな。1名の方が挙げた言語としてはActiveBasic、ACT-R、E-Prime、HSP、Java、KOBOL、Lisp、N88Basic、Presentation、Processingなどなど。PsychToolboxと書かれた方はMatlabに、VBAと書かれた方はVisual Basicとして集計させていただいた。

B: むむむ、知らないものがあるな…。

A: 用途についてもお聞きしたのだが、ちょっとこれは多岐にわたっていてまとめるという感じではなかった。まあMatlabはほぼ実験とデータ処理のため、Rはデータ処理のため、Visual Basicは幅広く。まあ、いずれにしてもMatlabとVisual Basicで実験している方々のサポートをしていかないということだな。私もSもVisual Basicはあまり経験がないのでちょっとハードルが高いが…。

B: C/C++は?

A: C/C++での経験がある方の多くはMatlabやVisual Basicのユーザーでもあるんだな。C/C++オンリーと言う方は少数派だったようだ。

B: なるほど。

A: さて、あとは自由記述欄。ご質問、ご要望になっているものを挙げる。以下、順番に取り上げよう。

  1. どのように勉強すればよいか?

  2. 専門用語の羅列はなんとかならないのか?

  3. PsychoPyで作成した実験はダブルクリックするだけで実行できるか?

  4. 動画刺激視聴中の評定を計測できるか?

  5. Rとの連携をシームレスに出来るか?

  6. pythonとMatlabの非線形フィッティングはどちらが楽か?

  7. ステレオモードで刺激提示してシャッターゴーグルと同期させることは出来るか?

  8. MRIなどとの外部装置の通信は可能か?

  9. タスクの作成やデータ解析についてのワークショップ開催の計画はあるか?

どのように勉強すればよいか?

A: うーむ、これはとっても大切な質問なのだが、残念ながら作者のSも私も長い時間をかけていろんな言語でいろんなプログラムを書いてきたうえでpythonを使い始めているので、pythonの習得自体にはテキストの類は一切頼っておらん。だもんでお勧めできる本とか知らんのだ。

B: え、いくらなんでも何も参考にしてないことはないでしょ?

A: VisionEggのサンプルコードが初めて読んだpythonで書かれたスクリプト。で、C/C++とかMatlabを知っていればだいたいわかるんで、後は「?」と思う表記を見たらざっとwebで検索をかけて。それだけ。

B: 参考にならないおっさんたちだなー。

A: そういうB君はどうなのよ?

B: え゛っ、僕ですか? いや、僕は…。ほら。僕のプログラミングのレベルはピーーーーの都合で変化自在ですから。

A: あ、やっぱり? ピーーーーとかピーーーーーだとB君の理解力は飛躍的に進歩するもんな。

B: そんなわけで僕のことはほっといて、どうやって勉強すればって話ですよ。

A: そうだなあ。私の持論としては、まず 万人に合う勉強方法はないので、自分に合う方法を探すしかない というを大前提として断っておいて、そのうえで 自分がやりたいことに近いスクリプトを探してきて、それを読んでみたり、すこし書き換えて見たりして何が起こるかを体験したりする のがいいと思うんだ。特に エラーメッセージは最高の教師 なので、よくわからないエラーメッセージが出てきたときにその意味を調べようと頑張ってみること。

B: ググっただけでエラーメッセージの意味を理解するにはすでにある程度の知識を持っていることが必要だと思いますが…。

A: そう、それよ。私が子供の頃はホビープログラマ向けの雑誌が何誌かあって、そういう雑誌を購読してヒマな時にテキトーに眺めていたらコンピュータの仕組みや言語の文法、いろいろな分野のプログラミングテクニックがなんとなく身に付いたものだった。今はそういう雑誌がほとんどなくなってしまったので自習が難しくなったんだろうなあと思う。

B: Aさんに子供の頃なんてあったんですか。

A: あったに決まっとる。そういう雑誌にはコードが載っていて、そのコードについての解説が記事の筆者それぞれのノリでおもしろおかしく添えられていた。今はwebを検索すれば良質なコードを当時とは比べ物にならないくらいたくさん入手することが出来るが、解説が添えられていないので自習のハードルがすごく高くなっている。

B: 「その状況を打破するためにこの『pythonで心理実験』を始めたのである(ドヤァ」ってわけですか。

A: 別にドヤ顔ではないが、まあそういう一面はある。

B: またまた、カッコつけちゃってー。

A: というわけで、コードをいじる時に手元に一冊日本語で書かれたpythonの入門書があれば便利だろう。Amaz○nとかで検索して☆の数なりコメントなりを参考にして適当なものを買ってもいいし、膨大なページ数のPDFファイルを印刷する気力があるのなら Python Japanのドキュメント翻訳プロジェクトのPDFファイル を印刷してもいいだろう。ちなみに私はこれのver2.5の資料を大いに活用させてもらった。chmファイルとかもあるんだけどウチのWin7環境だとエラーが出て閲覧に支障があった。

B: うへえ、ダウンロードして解凍したらPDFファイルが26個もあるじゃないですか。

A: 全部印刷する必要はない。まずはチュートリアル(tutorial.pdf)、あとは必要に応じて言語リファレンス(reference.pdf)、標準ライブラリ(library.pdf)を印刷したらいいんじゃないかな。

B: …それぞれ164ページ、161ページ、1798ページ(!)もあるんですが…。

A: ははっ。書籍を購入した方が使い勝手もいいだろうし、印刷代より書籍代の方が安いかも知れんな。この手のドキュメントには良くある事よ。さて、次の話題に行くか。

専門用語の羅列はなんとかならないのか?

A: これも耳が痛い指摘。でも、なんとかするのは難しいってことは研究者や大学院生の方々にはわかっていただけると思う。ゼミなどで初めて学術論文を読んだときに、用語の意味が分からなくて何が何やらさっぱりだったのではなかったか。でも今はいろんな専門用語を自分でも使いまくっていて、今自分が書いている論文を昔の自分にもわかるように書こうと思っても書けないのではないか。

B: …。

A: 専門用語をわかりやすい(と筆者が勝手に思っている)表現に置き換えることは可能だが、置き換えが却って正確な理解の妨げになっていないか。却って専門用語を覚える妨げになっていないか。

B: …Aさんの言わんとすることはわからなくもないですが、じゃあ初学者はどうしたらいいんですかね。

A: 心理学なんか毎年のように何冊も新しい本が出て、いろんな先生があちこちの大学でいろんな説明を試みていて、学ぶ人たちはいろんな人のいろんな説明に触れるうちに、自分の勘違いに気付いたり、自分にしっくり合う説明に出会ったりするのだと思う。「勉強の仕方」のところでも言ったように、万人に合っている説明なんてないと思っている。だから、私に出来ることは、私なりの説明を人目に付くところに掲げておくことだけ。誰かの役には立つかも知れない。

B: あのー。酔いしれておられるところに申し訳ないのですが、結局このコメントへの返答は?

A: てやんでいっ 四の五の言ってねえで勉強しやがれ!! ってなことで。

B: あーあ、台無しだよ。まったくこのおっさんは。

追記:専門用語の問題は筆者自身頭を悩ませていますが、専門用語の使用を避けると却ってわかりにくくなる面もあり難しい所です。幸い、今はwebを検索すれば用語解説のサイトがいくつもヒットしますので、自分に合う/信頼できる解説サイトに出会うまでは、 複数のサイトの記事を読み比べる ことをお勧めします。そのうちお気に入りのサイトが固まってくるのではないかと思います。

PsychoPyで作成した実験はダブルクリックするだけで実行できるか?

B: おっ、これならぼくにでも答えられるぞ。自分でエディタで書いたスクリプトなら、ダブルクリックすれば実行できます! PsychoPy Builderで作った実験はダメです!

A: んー、30点。まず、ご質問された方の環境がWindowsかどうかわからない。Windows限定の話なら…60点かな。

B: えー。確かにWindowsしか考えていませんでしたが、Windowsなら100点でしょ?!

A: PsychoPyをStandAloneでインストールしたか、easy_install等で既存のpythonにパッケージとしてインストールしたかで話が違う。StandAlone版なら拡張子 .py とpython.exeが関連付けられないのでダブルクリックしても実行できない。

B: うぐっ、た、確かに…。

A: そして、Builderで作った実験でも、コンパイルしておけば自分で書いたスクリプトと同じだ。Builderで実験を作成した後、Compile Scriptをクリックして…

../_images/20-1-01.png

A: Coderが自動的に開くので、コンパイルされたコードを好きな名前で保存しておけばよい。もちろん元のBuilderの実験で参照しているExcelファイルや画像ファイルは実行時に必要になるので注意すること。

../_images/20-1-02.png

B: あ゛ー。そっか、そんな手が。

A: Builderで作ったfoo.psyexpという実験ファイルをBuilder上から実行するとfoo_lastrun.pyというファイルができるが、これはfoo.psyexpをコンパイルしたものなので、このfoo.lastrun.pyを残しておいてこいつをダブルクリックしても実験を実行できる。

B: なるほど。さすがAさんらしいセコい手ですな。

A: いったい何がセコいというのか。さて、Windows環境で未解決の問題はStandAlone PsychoPyをインストールした場合だが、これの対策はわかるかな?

B: ええと、ええと。

A: OSに登録されていない拡張子のファイルをダブルクリックしたらどうなる。

B: へ? どうなるって、ファイルを開くアプリケーションを聞くダイアログが…ぁあ! なるほど。pythonの実行ファイルに関連付ければいいんですね。

A: その通り。StandAlone PsychoPyが入っていて通常のWindows用Pythonが入っていない環境なら、拡張子.pyを開く実行ファイルとしてStandAlone PsychoPyの中に含まれているPythonを指定すればいい。拡張子.pyのスクリプトをダブルクリックして、「インストールされたプログラムの一覧からプログラムを選択する」を選ぶ。

../_images/20-1-03.png

B: で、プログラムの選択でPythonの実行ファイルを指定すればいいんですね、わかる、わかるぞ!

../_images/20-1-04.png

A: StandAlone PsychoPyを普通にインストールしてれば、PsychoPyは"C:\Program Files (x86)"か"C:\Program Files"にあるはず。このフォルダの中のpythonw.exeを指定すればよいわけだね。python.exeでもいいんだが、python.exeにするとコマンドシェルがいちいち表示されるので、それを鬱陶しいと思う人はpythonw.exeにしておいた方が良いと思う。

B: python.exeとpythonw.exeの違いってそこにあったんですね。じゃ、pythonw.exeに関連付けして…

A: ま、私ならpython.exeに関連付けるけどね。

B: っって、えええ? pythonw.exeに関連付けるように誘導しておいて!

A: 別に誘導なんかしとらんよ。コマンドシェルが表示されているとそれはそれで便利だからなぁ。あくまで好みの問題。StandAlone PsychoPyとWindows用Pythonの両方をインストールしている人はバッチファイルを使うといいんじゃないかな。例えばrun_foo.batというファイル名でこんなのを書いておくとか。フルパスで書いておくのがポイントだね。

"C:\Program Files (x86)\PsychoPy2\pythonw.exe" foo.py

B: バッチファイルとは。まるで思いつきませんでした。いやはや。

A: さて、Windows環境はこんなもんだろ。Linuxではどうしたらいいかわかるか?

B: はっはっは、Aさん。ぼくにわかるわきゃあないじゃないですか。ははっ。

A: 開き直るな。Linuxではスクリプトの一行目にShebangが書かれていて、なおかつ実行のパーミッションが付いていればダブルクリックで実行できるはず。正確にはshellに依存するのかな?

B: Shebang?? shellに依存???

A: Linuxな人々にはおなじみのことと思うが、スクリプトの一行目にはよく #! から始まる文が書かれている。スクリプトを実行したときにこの #! の後に書かれているインタプリターが使用される。この #! をshebangという…、って実は私もこの機能は昔から知っていたがshebangという名前は最近知った。例えばPsychoPy Builderからコンパイルしたスクリプトの一行目には以下のような記述がある。

#!/bin/env python

B: 例題1-4 でちょっと触れたやつですね。これ、イマイチよくわからないんですけど、前に調べたら#!/bin/shと書かれていたら/bin/shをインタプリターとして使うって書いてあったんですが、んじゃこれは/bin/envを使うってことなんですか?

A: なんでそこまで自分で調べておきながら/bin/envについて調べないんだよ。envコマンドはもともと環境変数を変更してプログラムを実行するコマンドだが、ここではenvの引数であるpythonをpathから探して実行させるという目的で使っていると思われる。OSが違うとpythonの場所が/bin/pythonとか/usr/bin/pythonとかいろいろ違うかも知んないんで、その違いを吸収するためなんじゃないかと思う。正直なところよくわからんが、動きゃいいんだよ、動きゃ。

B: ぐは。相変わらずのAさん節ですな。

A: Linux慣れしてない方のために補足。スクリプトをダブルクリックで実行するには実行のパーミッションがついている必要がある。GUIでの操作はシェルに依存するので各自で勉強してもらうとして、コマンドシェルを使うなら、以下のようにchmod -xすればいい。

chmod +x foo.py

B: ええと、ややこしくなってきたのでまとめてみたぞ。こんな感じかな。

A: おお、こりゃいいな。ご苦労。

PsychoPy

対策

Windows
StandAloneでインストール

Builderの実験はコンパイルする。

スクリプトを実行するバッチファイルを作成する(別途Pythonをインストールしている場合はこちらが無難、StandAlone版のみ場合はこちらでも次でも構わない)

拡張子 .py をPsychoPyに付属のpython.exeまたはpythonw.exeに関連付ける(StandAlone PsychoPy以外にPythonがない場合)。

Windows
既存のPythonにパッケージとしてインストール

Builderの実験はコンパイルする。

手書きのスクリプトは普通にダブルクリックで実行できる。

Linux

Builderの実験はコンパイルする。

手書きのスクリプトにはshebangを書いて実行パーミッションを付ける。

動画刺激視聴中の評定を計測できるか?

A: 続いてこのご質問。「ご質問の意図を私が正しく理解できていないかも知れない」ってSが言ってたけど、私ぁ動画を再生しながら実験参加者の反応を記録できるかという意味だと理解した。そうだとしたら、回答は「できます」。例えばBuilderでMovieコンポーネントとRatingコンポーネントを並べておくと、動画を再生しながら参加者はスケールを操作できる。

../_images/20-1-05.png
../_images/20-1-06.png

A: ただし、Ratingコンポーネントは一回評定してしまったら終わりなので、連続的に反応をとり続ける場合は自前のコードを書くなりなんなりする必要があるだろう。

B: たとえばどんなコードですか?

A: ムービーも結局はdraw()メソッドで描画するだけなので、通常の実験と同じようにキーボードやマウスのイベントを取得してから刺激をdraw()してスクリーンをflip()する、という流れで書くことができる。こんな感じでどうだろう。

#coding: utf-8

import psychopy.visual
import psychopy.event
import psychopy.core
#MovieStimでムービーの再生状況を確認するために使う定数をimportしておく
from psychopy.constants import PLAYING, STARTED, PAUSED, NOT_STARTED, FINISHED

win = psychopy.visual.Window()
stim = psychopy.visual.MovieStim(win,'stim.mpg')
clock = psychopy.core.Clock()

keysLog = []
stim.play()
while stim.status!=FINISHED: #Movieの再生が終了するまで繰り返す
    keys = psychopy.event.getKeys() #キーイベントを取得
    if len(keys)>1: #何かキーが押されている
        keysLog.append([clock.getTime(),keys]) #keyLogにタイムスタンプとキーを追加
    stim.draw() #Movieを描画
    win.flip() #スクリーンをflip

win.close()

print keysLog #keyLogを表示

B: 実行してみました。これって時刻はどのくらい正確なんですかね?

[[2.424073681821028, ['7']], [4.077001263976854, ['3']],
 [6.013864011791156, ['4']], [9.537000775449997, ['7']],
 [11.590620099901571, ['space']], [13.544196368191479, ['5']],
 [17.534790000034263, ['6']]]

A: んー。秒単位でずれているようなことはないと思うが、厳密な話をするにはちょっときちんと独立した例題として取り上げる必要があるな。あ、それからマウスのボタンやカーソル座標も同じように取得できます。マウスの状態取得については 例題19-1 を参考にしてください。

Rとの連携をシームレスに出来るか?

A: 続いてはRとの連携について。実はこれは以前私が挫折した話なんで、残念ながらあまり役に立つ話は書けないかなあ。

B: 挫折ですか? どんな?

A: もうかなり前のことなんで、いつ頃だったかもなんで挫折したのかもよく覚えていない。とにかくpythonには rpy2 というpythonから直接Rの機能を呼び出すパッケージがある。Googleで検索したら以下のページがヒットした。拝見したところ、かなりきちんと使えるようになっているようなので、ぜひこれらのページを参考にしていただければと思う。

B: …あれ、これで終わり?

A: ん。人に勧める前に自分でも使ってみるべきなんだが、今はマジで時間がないんだ。いずれもう一度挑戦してレビューしてみたいとは思う。んじゃ、次。

pythonとMatlabの非線形フィッティングはどちらが楽か?

A: これはMatlabユーザーの方向けの話題。Matlabでの非線形フィッティングと言うと私はlsqcurvefitを思い浮かべるんだが、これとだいたい同じように使える関数scipy.optimize.curve_fitがある。こんな感じで使う。

import numpy
import scipy.optimize

def func(data,xm,ym,xs,ys,k,c):
    return k * numpy.exp(-((data[0]-xc)/xs)**2-((data[1]-yc)/ys)**2)) + g

param, flag = scipy.optimize.curve_fit(func, data, y, p0=(0,0,1,1,1,0))
residual = y - func(daga,param[0],param[1],param[2],param[3],param[4],param[5])

B: ええと、これはいくらなんでも説明不足じゃないですかね。

A: 第1引数が当てはめる関数、ここでは最初に定義しているfuncだね。このfuncは二次元Gauss関数で、7個の引数をとる。第1引数がN行2列のデータ。0列目がX座標、1行目がY座標のつもり。第2引数から第7引数は順番にGauss関数のX方向の中心、Y方向の中心、X方向の標準偏差、Y方向の標準偏差、高さ、定数項。で、与えられたデータに対応するGauss関数の値を返す。

B: ふむふむ(ってよくわかってないけど…)。

A: で、scipy.optimize.curve_fitの引数の説明に戻るが、第2引数は独立変数でN行2列のベクトル。第3引数は従属変数でN行1列のベクトル。最後のp0はパラメータの初期値。matlabのlsqcurvefitと引数の順番がちょっと違うけどよく似ているでしょう?

B: 「でしょう?」って言われてもぼくはぜーんぜん知らないんですが…。

A: scipy.optimize.curve_fitの戻り値paramに誤差を最少にするパラメータが格納されているので、paramとfuncを使って最終行のように残差を計算したりできる。

B: (ぽかーん)

A: Matlabのlsqcurvefitと全く同じといわけではないので、使い込んでいくと不便を感じることがあるかも知れませんが、私が使う範囲では何とかなっています。B君が放心状態になっているので、必要があれば改めて詳しく取り上げるとして次の話題へ。

ステレオモードで刺激提示してシャッターゴーグルと同期させることは出来るか?

A: この質問、私はシャッターゴーグルを持っていないので試せないんだが、最近のバージョンのPsyhoPyではサポートされているようだ。psychopy.visual.Window()のヘルプにこのようにある。

**Parameters**
 (snip)
 stereo : True or False

   If True and your graphics card supports quad buffers then this will be enabled.
   You can switch between left and right-eye scenes for drawing operations using
   setBuffer().

B: んんん? どういうことだろう。

A: setBuffer()メソッドを使って右目と左目のシーンを切り替えられるというんだからsetBuffers()のヘルプを見てみよう。

**setBuffer** (buffer, clear=True)
 Choose which buffer to draw to (‘left’ or ‘right’).
 Requires the Window to be initialised with stereo=True and requires a graphics
 card that supports quad buffering (e,g nVidia Quadro series)
 PsychoPy always draws to the back buffers, so ‘left’ will use GL_BACK_LEFT
 This then needs to be flipped once both eye’s buffers have been rendered.

 Typical usage:

 win = visual.Window(...., stereo=True)
 while True:
     win.setBuffer('left',clear=True) #clear may not actually be needed
     #do drawing for left eye
     win.setBuffer('right', clear=True)
     #do drawing for right eye
     win.flip()

B: おお、サンプルコードがありますね。ええと、まずウィンドウを作成するときに stereo=True オプションを付ける。そして刺激を描画するときに、左目用の刺激を描く前にwin.setBuffer('left',clear=True)、右目用の刺激を描く前にwin.setBuffer('right',clear=True)とする。…でいいのかな?

A: そのようだな。注意すべきなのは「Quad bufferingをサポートするカード(例えばnVidia Quadroシリーズ)が必要」と書いてある点だな。どんなPCでもいけるわけではない、と。Quadroは昔持っていたけど壊れてしまって今は持ってないな。どなたかが試してくださるといいんだが。

MRIなどとの外部装置の通信は可能か?

A: 次のお題。外部装置との通信はこの講座で扱わないといけないとずーっっと思っていたテーマのひとつ。だが、これまたご質問のMRIについては私はMRIを使う実験をしたことがないので公式サンプルを紹介するだけしかできない。サンプルはCoderの[Demos]オプションの[experiment control]の中にある。

../_images/20-1-07.png

A: ざっと見たところ、psychopy.hardware.emulator というモジュールのlaunchScan()という関数が鍵のようだ。ちょっと長くなるけどlaunchScan()のヘルプを引用してみる。

FUNCTIONS
    launchScan(win, settings, globalClock=None, simResponses=None,
    mode='None', esc_key='escape', instr='select Scan or Test, press enter',
    wait_msg='waiting for scanner...', wait_timeout=300)
      Accepts up to four fMRI scan parameters (TR, volumes, sync-key, skip),
      and launches an experiment in one of two modes: Scan, or Test.

    See Coder Demo -> experiment control -> fMRI_launchScan.py.

    In brief: 1) from psychopy.hardware.emulator import launchScan;
    2) Define your args; and 3) add 'vol = launchScan(args)'
    at the top of your experiment script.

launchScan() waits for the first sync pulse and then returns, allowing your
experiment script to proceed. The key feature is that, in test mode, it first
starts an autonomous thread that emulates sync pulses (i.e., emulated by your CPU rather
than generated by an MRI machine). The thread places a character in the key buffer, exactly like
a keyboard event does. launchScan will wait for the first such sync pulse (i.e.,
character in the key buffer). launchScan returns the number of sync pulses
detected so far (i.e., 1), so that a script can account for them explicitly.

If a globalClock is given (highly recommended), it is reset to 0.0 when the
first sync pulse is detected. If a mode was not specified when calling
launchScan, the operator is prompted to select Scan or Test.

If **scan mode** is selected, the script will wait until the first scan pulse
is detected. Typically this would be coming from the scanner, but note that
it could also be a person manually pressing that key.

If **test mode** is selected, launchScan() starts a separate thread to emit
sync pulses / key presses. Note that this thread is effectively nothing more than
a key-pressing metronome, emitting a key at the start of every TR, doing so with
high temporal precision.

If your MR hardware interface does not deliver a key character as a sync flag,
you can still use launchScan() to test script timing. You have to code
your experiment to trigger on either a sync character (to test timing) or
your usual sync flag (for actual scanning).

:Parameters:
  win: a :class:`~psychopy.visual.Window` object (required)

  settings : a dict containing up to 5 parameters (2 required: TR, volumes)
    TR :
        seconds per whole-brain volume (minimum value = 0.1s)
    volumes :
        number of whole-brain (3D) volumes to obtain in a given scanning run.
    sync :
        (optional) key for sync timing, default = '5'.
    skip :
        (optional) how many volumes to silently omit initially (during T1
        stabilization, no sync pulse). default = 0.
    sound :
        (optional) whether to play a sound when simulating scanner sync pulses

  globalClock :
    optional but highly recommended :class:`~psychopy.core.Clock` to
    be used during the scan; if one is given, it is reset to 0.000 when
    the first sync pulse is received.

  simResponses :
    optional list of tuples [(time, key), (time, key), ...]. time values
    are seconds after the first scan pulse is received.

  esc_key :
    key to be used for user-interrupt during launch. default = 'escape'

  mode :
    if mode is 'Test' or 'Scan', launchScan() will start in that mode.

  instr :
    instructions to be displayed to the scan operator during mode selection.

  wait_msg :
    message to be displayed to the subject while waiting for the scan to
    start (i.e., after operator indicates start but before the first
    scan pulse is received).

  wait_timeout :
    time in seconds that launchScan will wait before assuming something went
    wrong and exiting. Defaults to 300sec (5 minutes). Raises a TimeoutError
    if no sync pulse is received in the allowable time.

B: 長い長い長ーい! 手ぇ抜きすぎでしょ、Aさん!

A: いや、生半可な知識でテキトーなことを言うよりは良いでしょ。といいつつテキトーなことを言うと、どうやらスキャナーからの同期信号がキー押しイベントとして取得できるみたいだな。ただしpygameではダメでpygletをバックエンドとして使用する必要がある、と。使用しているスキャナーが同期信号としてkey charactorを送信してこない場合は自分でなんとかせぇと書いてあるのが気になる。

B: なんとかしろって、そんなご無体な。

A: すべてのスキャナーをサポートしろという方が無茶な話だがや。MRIの話はこのくらいにして、ほかにもパラレルポートを使う公式サンプルなどがCoderから見ることができる。

../_images/20-1-08.png

B: …って、あれ? 解説は?

A: 外部機器との入出力は別の例題で取り上げようと思う。とりあえずここでは公式サンプルの紹介ということで。次。

タスクの作成やデータ解析についてのワークショップ開催の計画はあるか?

B: ええと、これについてS先生はなんとおっしゃってるんですかね。

A: んー。最初の書置きにもあったけど、特定のテーマに限定したワークショップならやる気があるみたいだよ? でも優柔不断でテーマ決めらんないから自分から企画してはやんないんじゃないかなあ。

B: はあ、目に浮かぶような。

A: Sが気にしていたのは PsychoPyの授業への活用 に関するコメントだな。もともとSも私と同じVisionEgg派だが、授業に使うのならばPsychoPyの方が良いかも知れないというところからPsychoPyの解説が始まっていることだし。

B: はあ、そうだったんですか。

A: もともと奴は「Builderだったら学生さんでも自分で実験を作れるんじゃないか」と思って手を出したようなんだけど、今は「Builderの使い方をマスターしても卒業後に役に立たないし、pythonのスクリプトを書くことを教えてやったほうがいいんじゃないか」と思っているらしい。ま、奴は実際 (自主規制)(自主規制) の仕事にpythonを大いに活用しているようだし。

B: いろいろ便利ですよね。ほんと。

A: ちなみにMatlab/Octaveじゃなくてpythonを選んだのもその辺りを考えてのことらしい。Matlabなんて個人で通常価格でなんて買ってられんし、研究じゃない用途なら断然pythonの方が潰しが効くからなあ。

B: なるほど、pythonを選んだ背景にはそんな理由が。

A: が、今回いただいたコメントの中で「心理学専攻じゃない学生に短いトレーニング時間で実験を作らせる」という話が出てきて、そういう話ならBuilderの方がやっぱりいいのかなあ…とか思ったそうな。確かにそのような用途にはBuilderの方が向いている。

B: ふうん。よくわかんないっすけど大変ですねえ。

A: チョー他人事な口ぶりだな。まあ他人事だろうが。私もB君にプログラミングを教える身としてはいろいろ考えさせられる。

B: えっ、Aさんはプログラミングを教えているつもりなんですか、ぼくはてっきり

------------------------------ 自 主 規 制 ------------------------------

(例題20-1はこれにておしまい、B君の運命やいかに?)