付録 ===================================================== 本文未解説コンポーネント --------------------------------------------- PsychoPy Builder 2022.2.4で利用できるコンポーネントのうち、本文で取り上げなかったものの概要を示します。 Apertureコンポーネント 画面を「穴」で切り抜くコンポーネントです。このコンポーネントはルーチンペインにおける描画順序の影響を受けません。つまり、Apertureコンポーネントの上に他の刺激を重ね書きしようとしてもApertureコンポーネントに切り抜かれてしまいます。 Dotsコンポーネント 一様に運動する小さな点を大量に描くコンポーネントです。運動視の研究などに用います。Polygonコンポーネントを大量に用いるよりPCへの負担が軽く、高速に描画できます。以下の解説では、点が描画される範囲をフィールドと呼んでいます。また、指定された方向に動く点をターゲット、それ以外の方向に動く点をノイズと呼んでいます。 EnvelopeGratingコンポーネント キャリアとエンベロープという2つの周期的なテクスチャをブレンドした刺激を描くコンポーネントです。 Noiseコンポーネント 様々なノイズ画像を描くコンポーネントです。ノイズの種類やパラメータ、更新タイミングなどを指定できます。 Brushコンポーネント 画面上にマウスカーソルの軌跡を描けるようにするコンポーネントです。今のところ描いた軌跡を簡単に保存する方法がないので、使いどころが難しいかもしれません。 cedrusButtonBoxコンポーネント Cedrus製の反応ボタンボックスを用いて反応を記録するコンポーネントです。Keyboardコンポーネントのように検出するボタンを指定してルーチンを終了させたりすることができます。 ioLabsButtonBoxコンポーネント ioLabs Systems製のボタンボックスを用いて反応を記録するコンポーネントです。Keyboardコンポーネントのように検出するボタンを指定してルーチンを終了させたりすることができます。 JoyButtonコンポーネント ジョイスティックで反応を記録するコンポーネントです。Keyboardコンポーネントのように検出するボタンを指定してルーチンを終了させたりすることができます。 Joystickコンポーネント ジョイスティックで反応を記録するコンポーネントです。JoyButtonコンポーネントと異なり、ボタンのみではなくスティックの状態も記録されます。ルーチンの実行中にジョイスティックの状態にアクセスするにはCodeコンポーネントを使ってJoystickオブジェクトにアクセスする必要があります。 ResourceManagerコンポーネント オンライン実験用のコンポーネントです。実験に使用するリソース(画像ファイルなど)をダウンロードするタイミングを制御します。 EmotivMarkingコンポーネント Emotive製のEEGにマーカーを送信するコンポーネントです。 EmotivRecordingコンポーネント Emotive製のEEGで記録を行うコンポーネントです。 Unknownコンポーネント 新しいバージョンのBuilderで追加されたコンポーネントを使った実験を古いバージョンのBuilderで開いた時など、使用中のBuilderで利用できないコンポーネントが実験に含まれてる場合があります。このような時、利用できないコンポーネントがUnknownコンポーネントとして表示されます。実験を作成する際にこのコンポーネントを配置しても何も起きません。 ParallelOutコンポーネント パラレルポートからのトリガー出力を行うためのコンポーネントです。 SerialOutコンポーネント シリアルポートでの入出力を行うためのコンポーネントです。 EyeTreackerCalibrationコンポーネント アイトラッカーのキャリブレーションを行います。通常のコンポーネントではなく単独で **ルーチンとして** フローに組み込んで使用します。実験設定ダイアログの「アイトラッキング」タブで選択できるアイトラッカーに対応しています。 EyeTreackerValidationコンポーネント アイトラッカーのバリデーション(キャリブレーション精度の確認)を行います。通常のコンポーネントではなく単独で **ルーチンとして** フローに組み込んで使用します。 EyeTreackerRecordコンポーネント アイトラッカーによる記録の開始、終了を制御するコンポーネントです。 RegionOfInterestコンポーネント ROIを定義し、視線の停留などを記録するコンポーネントです。 PeristalticPumpコンポーネント LabeoTech社のディスペンサーを制御するコンポーネントです。 QmixPumpコンポーネント Qmixライブラリ対応のシリンジユニットを制御するコンポーネントです。 .. _appendix-reserved-words: 予約語 ---------------------------------------------- .. psychopy.experiment.exports.NamSpace参照 Pythonの予約語 (Python 3.7) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pythonインタプリタを起動してkeywordをimportすると、keyword.kwlistというリストにPython予約語の一覧が格納されます。以下にPython3.7の予約語を示します。これらの語はBuilderにおいて **[名前]** や変数名として使用することはできません。 FALSE, None, TRUE, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield \_\_builtin\_\_という内部モジュールに含まれる以下の語はPythonの予約語ではありませんが、予約語と同様に扱われます(つまり **[名前]** や変数名として使用することはできません)。 ArithmeticError, AssertionError, AttributeError, BaseException, BlockingIOError, BrokenPipeError, BufferError, BytesWarning, ChildProcessError, ConnectionAbortedError, ConnectionError, ConnectionRefusedError, ConnectionResetError, DeprecationWarning, EOFError, Ellipsis, EnvironmentError, Exception, False, FileExistsError, FileNotFoundError, FloatingPointError, FutureWarning, GeneratorExit, IOError, ImportError, ImportWarning, IndentationError, IndexError, InterruptedError, IsADirectoryError, KeyError, KeyboardInterrupt, LookupError, MemoryError, ModuleNotFoundError, NameError, None, NotADirectoryError, NotImplemented, NotImplementedError, OSError, OverflowError, PendingDeprecationWarning, PermissionError, ProcessLookupError, RecursionError, ReferenceError, ResourceWarning, RuntimeError, RuntimeWarning, StopAsyncIteration, StopIteration, SyntaxError, SyntaxWarning, SystemError, SystemExit, TabError, TimeoutError, True, TypeError, UnboundLocalError, UnicodeDecodeError, UnicodeEncodeError, UnicodeError, UnicodeTranslateError, UnicodeWarning, UserWarning, ValueError, Warning, WindowsError, ZeroDivisionError, \_, \_\_build\_class\_\_, \_\_debug\_\_, \_\_doc\_\_, \_\_import\_\_, \_\_loader\_\_, \_\_name\_\_, \_\_package\_\_, \_\_spec\_\_, abs, all, anyascii, bin, bool, bytearray, bytes, callable, chr, classmethod, compile, complex, copyright, credits, delattr, dict, dir, divmod, enumerate, eval, exec, exit, filter, float, format, frozenset, getattr, globals, hasattr, hash, help, hex, id, input, int, isinstance, issubclass, iter, len, license, list, locals, map, max, memoryview, min, next, object, oct, open, ord, pow, print, property, quit, range, repr, reversed, round, set, setattr, slice, sorted, staticmethod, str, sum, super, tuple, type, vars, zip PsychoPyの予約語(2020.2.9) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 以下の語はPsychoPyで利用するモジュール名のため、Builderにおいて **[名前]** や変数名として使用することができません。 gui, misc, visual, core, event, data, sound, microphone, psychopy, os 以下の語はPsychoPyで予約されているため、Builderにおいて **[名前]** や変数名として使用することができません。 ENVIRON, FINISHED, FOREVER, NOT\_STARTED, PAUSED, PLAYING, PRESSED, PSYCHOPY\_USERAGENT, PY3, RELEASED, SKIP, STARTED, STOPPED, \_\_builtins\_\_, \_\_cached\_\_, \_\_doc\_\_, \_\_file\_\_, \_\_loader\_\_, \_\_name\_\_, \_\_package\_\_, \_\_spec\_\_, \_gitStandalonePath, absolute\_import, abspath, copy, gitExe, join, os, print\_function, sys 以下の語はBuilderで予約されているため、Builderにおいて **[名前]** や変数名として使用することができません。 KeyResponse, keyboard, buttons, continueRoutine, expInfo, expName, thisExp, filename, logFile, paramName, t, frameN, currentLoop, dlg, \_thisDir, endExpNow, globalClock, routineTimer, frameDur, theseKeys, win, x, y, level, component, thisComponent 以下の語はnumpyおよびnumpy.randomからimportされるのでBuilderにおいて **[名前]** や変数名として使用することはできません。 asarray, average, cos, deg2rad, linspace, log, log10, normal, np, pi, rad2deg, randint, random, shuffle, sin, sqrt, std, tan Builderの内部変数(2020.2.9) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Builderで使用されている内部変数の概要を示します。 .. tabularcolumns:: |p{12zw}|p{30zw}| .. csv-table:: :header: "予約語", "概要" :widths: 20, 80 :class: longtable KeyResponse, 予約されています。 \_thisDir, Builderを実行するときにカレントフォルダをpsyexpファイルがある場所に移動するために使用されます。 buttons, 最後に取得したマウスのボタンの状態を示すリストが格納されています。 component, 予約されています。 continueRoutine, 実行中のルーチンを継続するか否かを示す真偽値が格納されています。→ :numref:`第%s章 ` currentLoop, Loopの種類でstaircase、interleaved staircasesを選択したときに使用されます。→ :numref:`第%s章 ` dlg, expInfoダイアログを作成するために使用します。 endExpNow, ESCキーによる実験の中断を有効にしているときに、この変数を利用してESCキー以外のキーで実験を終了できます。 expInfo, expInfoダイアログの項目と値が辞書オブジェクトとして格納されています。→ :numref:`第%s章 ` 、:numref:`第%s章 ` expName, 実験設定ダイアログの **[実験の名前]** に入力した実験名が格納されています。 filename, 各種実験記録ファイルやログファイルのファイル名を生成するために利用されます。 frameDur, フレームレートの実測値を保持しています。計測に失敗した場合は1/60secにセットされます。 frameN, 現在のフレーム番号を格納しています。→ :numref:`第%s章 ` globalClock, 実験開始からの経過時間を計測するためのpsychopy.core.Clockのインスタンスが格納されています。→ :numref:`第%s章 ` keyboard, キーボード用のライブラリの読み込みのために使用されています。 level, Loopの種類でstaircase、interleaved staircasesを選択したときに使用されます。→ :numref:`第%s章 ` logFile, ログファイルを作成するためのpsychopy.logging.LogFileのインスタンスが格納されています。 paramName, Loopの種類でinterleaved staircasesを選択したときに使用されます。→ :numref:`第%s章 ` routineTimer, ルーチン終了までの残り時間を計測するためのpsychopy.core.CountdownTimerのインスタンスが格納されています。 t, ルーチンが開始してからの経過時間を格納しています。→ :numref:`第%s章 ` theseKeys, 最後に取得したキーの状態を示すリストを格納しています。→ :numref:`第%s章 ` thisComponent, 現在処理中のコンポーネントに対応するインスタンスが格納されています。 thisExp, フローの制御ややデータの保存に関与するpsychopy.data.ExperimentHandlerのインスタンスが格納されています。 win, 刺激提示スクリーン本体であるpsychopy.visual.Windowのインスタンスを格納しています。 x, 最後に取得したマウスカーソルのX座標を格納しています。Mouseコンポーネントの **[マウスの状態を保存]** の設定によって単独の値であったりリストであったりします。 y, 最後に取得したマウスカーソルのY座標を格納しています。Mouseコンポーネントの **[マウスの状態を保存]** の設定によって単独の値であったりリストであったりします。 以上に加えて、以下の語は正常なルーチンの実行に必須の変数名と一致するのでBuilderにおいて **[名前]** や変数名として使用することはできません。 .. csv-table:: :widths: 36, 64 trialComponents (trialはルーチン名), 当該ルーチンでフレーム毎に処理する必要があるコンポーネントのインスタンスを並べたリストが格納されています。→ :numref:`第%s章 ` trialClock (trialはルーチン名), 当該ルーチンが開始されてからの経過時間を計測するpsychopy.core.Clockのインスタンスが格納されています。→ :numref:`第%s章 ` ログファイル --------------------------------------------- PsychoPy Builderで実験を実行すると、拡張子 .log のログファイルが作成されます。実験が十分な精度で実行されているかどうかを確認したい場合や、どうも意図している通りに刺激が提示されないといった問題が生じている時に、このログファイルから情報が得られる場合があります。ただし、Builderの実験がどのようなコードにコンパイルされて実行されるのかある程度知識がないと対策をとることまでは難しいかも知れません。 ログには以下のレベルがあります。実験設定ダイアログでログの出力レベルを選択すると、選択されたレベル以上のログがログファイルに出力されます。例えばwarningを選択すると、waringとerrorのレベルのログが出力されます。infoを選択すると、info、exp、data、warning、errorのレベルのログが出力されます。 1. error 2. warning 3. data 4. exp 5. info 6. debug 以下にdebugを選択した場合のログファイルの先頭部分の例を示します。非常に長い行は中略してあります。 各行の最初の数値が実験開始からの経過時間(秒)、続いてログのレベルが示されています。レベルに続いてその時刻に生じたイベントの内容が書かれています。 :: 3.0528 WARNING Movie2 stim could not be imported and won't be available 7.8399 INFO Loaded monitor calibration from ['2015_06_02 16:25'] 8.9837 EXP Created window1 = Window(allowGUI=False, allowStencil=False, ... (略) 8.9838 EXP window1: recordFrameIntervals = False 9.1467 EXP window1: recordFrameIntervals = True 9.3343 DEBUG Screen (0) actual frame rate measured at 58.77 9.3344 EXP window1: recordFrameIntervals = False 9.9161 EXP Created text = TextStim(alignHoriz='center', alignVert= ... (略) 9.9274 EXP Created stimulus = Polygon(autoDraw=False, autoLog=True, ... (略) 9.9286 EXP ` 」で紹介したキー名を表示させる実験などは、Pilotモードで実行するのがおすすめです。 .. figure:: fig202411/202411_pilot_frame.png :width: 70% Pilotモードで実験を実行するとウィンドウモードで実行され、オレンジ色の枠が描画されます。 Pilotモードでのウィンドウモード強制やオレンジ色の枠の描画は、「PsychoPyの設定」ダイアログに追加された「Pilotモード」で無効にすることができます。ここでは他にもログファイルに出力される情報の変更(標準では最も詳細な動作情報が出力されるdebugに設定されている)や、後述のrushモードを利用するか否かを切り替えることができます。通常、これらの設定を変更する必要はないでしょう。 .. figure:: fig202411/202411_pilot_settings.png :width: 70% PsychoPyの設定ダイアログでPilotモードの動作を変更できます。 rushモードというのは、実験プログラムの優先度を高めるモードです。WindowsにせよMacOSにせよ、現代のOSでは、さまざまな便利な機能を実現するために、ユーザー側からは見えない数多くのプロセスが実行されています。実験の実行中に他のプロセスが処理時間を要する作業を始めると、実験の時間精度に悪影響を与えることがあります。rushモードをONにすると、PsychoPyは実験実行時に実験のプロセスをできる限り高い優先度で実行しようとします。rushモードを使うかどうかは「実験の設定」ダイアログの「基本」タブにある **[rushモード]** で実験ごとに指定できます。 フレームレート測定機能のON/OFF ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Builderは実験の時間精度を確保するために、実験実行環境のフレームレートの実測値に基づいて刺激を制御しています。少し前のバージョンのBuilderより、実験を実行すると最初に"Attempting to measure frame rate of screen, please wait..."というメッセージが表示されるようになりましたが、この時にフレームレートの測定を行っています。どの程度の時間精度が必要かは実験の内容に寄りますが、時間精度が高すぎて困るということはないでしょうから、原則としてこの機能はONにしておくべきです。 しかし、マルチモニター環境など、一部の実行環境でフレームレート測定機能のせいで実験がうまく開始されないことがあるため、フレームレート測定をOFFにする機能が追加されました。 「実験の設定」ダイアログの「スクリーン」タブに **[フレームレートの測定]** という項目があり、その下に **[フレームレート測定時のメッセージ]** という項目があります。 **[フレームレートの測定]** のチェックをOFFにすると、 **[フレームレート測定時のメッセージ]** が **[フレームレート]** に変わります。これでフレームレート測定がOFFになりましたが、Builderの実験は **フレームレートが与えられないと正常に動作しない** ため、 **[フレームレート]** にフレームレートを得るための式を書かなければいけません。60Hzのモニターを使っているのなら60と直接入力してもよいでしょうし(仕様通りに動作するとは限らないからこそ実測するのですが、それほど時間精度が必要ないなら十分でしょう)、フレームレートを得るための独自の式を書いても構いません。 .. figure:: fig202411/202411_framerate_settings.png :width: 70% フレームレート測定機能をOFFにすることができます。 なお、フレームレート測定機能がONのとき、 **[フレームレート測定時のメッセージ]** を編集すれば画面上に表示されるメッセージを変更できます。ただし、バージョン2024.1.1の時点でフォントの種類や大きさを変更することができません。日本語の文字などの非ASCII文字は文字化けする可能性が高いのでご注意ください。 ルーチンごとのスクリーン設定/ルーチンのスキップ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Routineペインの左上に[Routineの設定]が追加され、ルーチン毎に設定を切り替えられるようになりました。ルーチンの設定ダイアログには「基本」、「Flow」、「ウィンドウ」、「データ」、「テスト」のタブがあります。「データ」と「テスト」はコンポーネントのプロパティ設定ダイアログと同じです。「基本」ではルーチンの名前を変更できるほか、ルーチンについての説明を記入しておくことができます。ルーチンを使いまわす時などのためにいろいろとメモしておくとよいでしょう。 「ウィンドウ」タブにある **[このルーチン固有のスクリーン設定を使用]** をチェックすると、 :numref:`fig-202411-routine-screen` のようにスクリーンの背景色と背景画像に関する項目が表示されます。これらは実験の設定ダイアログの「スクリーン」タブにある同名の項目と同じ働きをしますが、このルーチンに対してだけ有効です。 .. _fig-202411-routine-screen: .. figure:: fig202411/202411_routine_screen.png :width: 70% ルーチンごとに背景色と背景画像を設定できます。 「Flow」タブには **[タイムアウト]** と **[条件に合致する場合はスキップ...]** という項目があります。 .. figure:: fig202411/202411_routine_flow.png :width: 70% [Flow]タブではルーチンの終了時刻を設定したり、ルーチンをスキップする条件を設定したりできます **[タイムアウト]** は通常のコンポーネントの **[終了]** と同様ですが、ルーチン内にまだ終了していないコンポーネントがあっても強制的に終了させることができます。 :numref:`fig-202411-routine-flow-limit` ではkey_respとpolygonの **[終了]** を空白にして終了しないようにしていますが、ルーチンの設定の **[タイムアウト]** を2秒に設定しています。タイムラインの2秒のところにオレンジの線が引かれて、それより右側ではkey_respとpolygonの実行期間を示すバーがグレーになっているのがわかります。 おそらくこの機能が真価を発揮するのは、何らかの条件により繰り返しのたびに制限時間が変化するルーチンを作成する必要がある時です。従来なら、ルーチン内の(制限時間の変化を受ける)すべてのコンポーネントの終了時刻を変数にする必要がありましたが、この **[タイムアウト]** を使うと一か所設定するだけで済みます。他には、実験の動作確認を短時間で行うために、重要ではないルーチンの **[タイムアウト]** を0.5秒や1秒に設定すれば、そのルーチンをきちんと表示させつつ短時間で先のルーチンへ進めることができます。 .. _fig-202411-routine-flow-limit: .. figure:: fig202411/202411_routine_flow_limit.png :width: 70% **[タイムアウト]** を設定すると、それより長時間実行されるよう設定されているコンポーネントがあっても強制的にルーチンが終了します。 **[条件に合致する場合はスキップ...]** は非常に重要な機能です。 例えば200試行を繰り返すループがあって、50試行ごとにキーを押すまで先へ進まない休憩用の画面を表示したいとします。従来、このような手続きはループの繰り返し回数に0を設定するテクニックとCodeコンポーネントを組み合わせるか、Codeコンポーネントを使って1フレームも描画する前にルーチンを抜ける必要がありましたが、このような「泥臭い」方法を使わずに実現できるようになります。 具体例として、 :numref:`fig-202411-routine-flow-skip` のようにtrialsループ内にtrialとrestというルーチンがあって、繰り返し50回毎にrestを表示したいとします。 このとき、tralsループのデータ属性thisNには現在の繰り返し回数を表す整数が格納されているので(最初の繰り返しが0)、trials.thisN % 50とすれば現在の繰り返し回数を50で割った余りが得られます。 trials.thisN % 50 != 0とすれば余りが0でない時にスキップされるので、結果として50回の繰り返しに1度だけルーチンが実行されます。 「 :numref:`{number}:{name} ` 」も参考にしてください。 .. _fig-202411-routine-flow-skip: .. figure:: fig202411/202411_routine_flow_skip.png :width: 70% **[条件に合致する場合はスキップ...]** を使うと繰り返し中の特定の回だけ実行されるルーチンを簡単に作成できます。 CounterBalanceルーチン ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ これも非常に重要な新機能であり、従来は難しかった参加者間のカウンターバランスを取ることが可能となります。 CounterBalanceルーチンは、Componentペインの「カスタム」カテゴリの中にあります( :numref:`fig-202411-counterbalance` 参照)。 Componentペインにあるアイテムは通常「Codeコンポーネント」のように「コンポーネント」と呼ばれますが、CounterBalanceルーチンは「ルーチン」と呼ばれている点にご注意ください。 CounterBalanceルーチンは他のコンポーネントのように「ルーチンの中に配置する」のではなく、それ自体が独立したルーチンとして働きます。 ですので、CounterBalanceルーチンのアイコンをクリックすると、:numref:`fig-202411-counterbalance` のようにcounterbalaranceというルーチンが追加されます。 そしてcounterbalanceルーチンは通常のルーチンのようにタイムラインが表示されず、counterbalanceルーチンの動作を決定する項目が表示されます。 作成されたCounterBalanceルーチンは、:numref:`fig-202411-counterbalance` のFlowペインのようにフロー内に1回挿入することによって有効になります。 .. _fig-202411-counterbalance: .. figure:: fig202411/202411_counterbalance.png :width: 70% CounterBalanceルーチンを挿入した様子 CounterBalanceルーチンは、初期状態で :numref:`fig-202411-counterbalance` のように **[グループの定義...]** が「グループ数」に設定されています。 この設定のときのCounterBalanceルーチンの動作を :numref:`fig-202411-counterbalance-behav` に示します。 図上段の左端は、 **[グループ数]** を2、 **[グループごとのスロット]** (以下スロット)を5、 **[繰り返し回数]** を1に設定した後、最初に実験を実行した直後の状態を示しています。 **[グループ数]** で設定した個数の箱のようなものが用意され、順番に0, 1と番号がつけられています。 それぞれの箱には **[グループごとのスロット]** で設定した個数のボール(とでもしておきましょう)が入っています。 実験が1回実行されるたびに、いずれかのグループがランダムに選択され、そのグループからボールがひとつ取り出されていきます。 選択されたグループは、counterbalance.group(counterbalanceの部分はCounterBalanceコンポーネントの **[名前]**)というデータ属性で参照できます。 各グループの残り個数は実験のフォルダに自動的に作成される **shelf.jsonというファイルに保存されます。** そして、すべてのグループのボールがなくなると、グループを選択することができないためcounterbalance.groupの値はNoneになります。 **[使いつくした場合に実験を終了]** をチェックしておくと、すべてのグループのボールが残っていない場合に自動的に実験が終了します。 .. _fig-202411-counterbalance-behav: .. figure:: fig202411/202411_counterbalance_behav.png :width: 70% CounterBalanceルーチンの働き :numref:`fig-202411-counterbalance-behav` の下段は **[繰り返し回数]** の働きを示しています。 **[繰り返し回数]** を2以上の整数にすると、すべてのスロットが満ちている状態から空になるまでの動作を設定された回数だけ繰り返します。 したがって、 **[グループごとのスロット]** を6、 **[繰り返し回数]** を1に設定した場合も、 **[グループごとのスロット]** を3、 **[繰り返し回数]** を2に設定した場合も、各グループは6回実行されます。 ただし、前者の場合はグループ0が6回連続した後にグループ1が6回連続するということが稀とはいえ起こり得ますが、後者の場合は各グループ3回までしか連続することがありません。 「 :numref:`{number}:{name} ` 」におけるfullRandomとrandomの違いに似ていると言えるでしょう。 なお、現在の実行状況を保存しているshelf.jsonというファイルはJSONという形式のテキストファイルであり、一般的なテキストエディタで内容を確認することができます。 JSONについてここでは詳しく触れませんが、だいたい想像がつくのではないかと思います。 .. code-block:: json { "counterbalance": { "_reps": 1, "0": 5, "1": 4 } } 実験の作成中、一度動作確認した後に **[グループ数]** や **[グループごとのスロット]** を変更しても、変更が反映されず以前の設定のままとなることがあります。 その場合は **shelf.jsonを削除すれば次回の実行時に変更後の設定でshelf.jsonが作成されます。** 本文中でこのCounterBalanceルーチンを紹介するとすれば、もっともふさわしいのは :numref:`第%s章 ` でしょう。 「 :numref:`{number}:{name} ` 」では20度と70度の2種類のコンテキスト刺激のどちらを使用するかを実験情報ダイアログで選ぶようにしました。 ここで実験情報ダイアログに項目を追加せず、代わりにCounterBalanceルーチンを作成してフローの先頭(厳密にはグループ名を必要とするルーチンやループより前)に挿入し、 **[グループ数]** を2にします(初期値のまま)。 **[グループごとのスロット]** と **[繰り返し回数]** は募集する参加者数に応じて決めます。 そして、条件ファイル名(exp04_20.xlsxとexp04_70.xlsx)をexp04_group0.xlsx、exp04_group1.xlsxのように **グループ番号だけが異なる名前** にします。 先述の通り、選択されたグループ名は counterbalance.group で得られるのですから、trialsループに指定する条件ファイルを以下のようにすれば、グループに応じて条件ファイルを切り替えられます。グループ名は0や1といった数値ですがデータ型はstrであることに注意してください(あと$も忘れずに!)。 .. code-block:: python 'exp04_group'+counterbalance.group+'.xlsx' グループごとに不均等な回数を割り当てる必要がある場合や、グループごとに切り替えたいパラメータがある場合は、 **[グループの定義...]** で「条件ファイル」を選択します。 この条件ファイルには以下のパラメータが必要です。 .. csv-table:: :widths: 24, 72 group, グループ名。日本語の文字などの非ASCII文字も使えます。 cap, 各グループに割り当てる回数。 これら以外のパラメータが与えられた場合、実験内ではcounterbalance.params['パラメータ名']という式で値を参照することができます。 具体例として、 :numref:`fig-202411-counterbalance-cndfile` のような条件ファイルを考えます。 .. _fig-202411-counterbalance-cndfile: .. figure:: fig202411/202411_counterbalance_cndfile.png :width: 70% CounterBalanceルーチン用の条件ファイルの例 「70度条件」グループに10回、「20度条件」グループに40回を割り振っていますので、50回実験を行うと10回(20%)が70度条件、40回(80%)が20度条件になります。 さらにconditionsFileというパラメータを用意して対応する条件ファイル名を定義していますので、ループの条件ファイルは以下のように書くことができます。 先の例のようにexp04_group0.xlsx, exp04_group1.xlsxといった番号順の条件ファイル名よりも、内容がわかりやすくて管理しやすいでしょう。 .. code-block:: python 'counterbalance.params['conditionsFile'] ユーザーインターフェースの変更 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Builder, Coder, Runnerの各ウィンドウにあったツールバーが、Microsoft Officeのようなリボンに変更されました。 とはいえOfficeのようにリボンにタブがあるわけではないので使い勝手はあまり変わりません。 アイコングループごとに「ファイル」や「編集」といったラベルが表示されるようになったので少しわかりやすくなったといえるでしょう。 Runnerは大きくレイアウトが変更され、ウィンドウ内に大きなペインが二つ並ぶようになりました。左側は登録されている実験のリストで、右側に「注意」や「出力」などがタブ切り替えで表示されます。 「注意」や「出力」の欄が格段に大きくなり、読みやすくなりました。 また、Pavlovia関係のメッセージが表示される「Pavlovia」というタブが新設されています。 続いて2点、 **Builderの使い勝手を大きく左右する機能が2つ追加されています。** ひとつめはBuilderの「ファイル」メニューに追加された「ファイルエクスプローラで開く」です( :numref:`fig-202411-UI-reveal-in-explorer` )。この項目を選択すると、現在Builderで編集中の実験のフォルダがOSの標準ファイルエクスプローラーで開きます。 .. _fig-202411-UI-reveal-in-explorer: .. figure:: fig202411/202411_UI_reveal_in_explorer.png :width: 70% 「ファイルエクスプローラで開く」メニュー 「実験の条件ファイルや刺激として使用する画像ファイルなどを、実験のフォルダに移動させる」という作業はBuilderを使用していると度々必要となります。 実験のフォルダをフォルダ階層の深い位置に置いていると開くのが面倒ですが、「ファイルエクスプローラで開く」を使うと一発で開くことが出来ます。 なにより「Builderを習い始めた人が、自分が作っている実験のフォルダがどこなのかわからない」というトラブルがぐっと軽減されると思われます。 Builderの使いかたを教える人は、できるだけ早い段階(本書で言うと2章か3章)でこの機能を紹介し、4章や6章など、複数の条件ファイルや画像ファイルを扱う作業を行うたびに強調するとよいと思います。 もうひとつは2024.1.1より前からある機能ですが、本書ではまだ紹介していないものです。Builderの「実験」メニューにある「実験内を検索...」という項目がそれです( :numref:`fig-202411-UI-search-menu` )。 .. _fig-202411-UI-search-menu: .. figure:: fig202411/202411_UI_search_menu.png :width: 70% 「実験内を検索...」メニュー 「実験内を検索...」を選択すると、 :numref:`fig-202411-UI-search-result` のようなダイアログが表示され、一番上の入力欄に検索語を入力すると、その文字列をプロパティに含むコンポーネント(とそのプロパティ)が一覧表示されます。 この例のorder_images_list[0], order_images_list[1],...といったように多数のコンポーネントに少しずつ異なる値を設定する必要がある(そのためコピー&ペーストだけでは作成できない)実験で入力内容に誤りがないか確認したい場合などに非常に便利な機能です。 .. _fig-202411-UI-search-result: .. figure:: fig202411/202411_UI_search_result.png :width: 70% 実験の検索ダイアログ 本書では、第4章で教示画面を作成する時にこの機能の使いかたを紹介すると良いでしょうし、第8章や第13章のような実験を作成する時にも役立つでしょう。 初心者からステップアップする際には確実に使いこなせるようになっておきたい機能だと思います。 実験の設定ダイアログの変更 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 実験の設定ダイアログの変更をまとめておきます。 - 基本タブ - **[実行モード]** の追加 - **[rushモード]** の追加 - スクリーンタブ - **[ウィンドウバックエンド]** の追加 - **[色]** は **[背景色]** に変更 - **[背景画像]** の追加 - **[背景画像の伸縮]** の追加 - **[フレームレートの測定]** の追加 - **[フレームレート測定時のメッセージ]** の追加 フレームレート測定をおこなわない場合は **[フレームレート]** になる - データタブ - **[列の並び替え...]** の追加 - **[列の優先度]** の追加 - **[時刻のフォーマット]** の追加 大部分はここまで紹介したものに関係していますが、「データ」タブは補足が必要でしょう。 Builderが出力するデータファイルにおける列の並び順が **[列の並び替え...]** で変更できるようになりました。 「アルファベット順」は文字通り列名のアルファベット順です。 「追加順」というのは実験の実行中にデータファイルに追加された順番で、従来のBuilderと同じです。 説明が必要なのは「優先度」で、これを選択すると **[列の優先度]** で指定した優先度にしたがって並び替えられます。 以下の定数が定義されています。定数の値は変更される可能性があるので書くべきではないかもしれませんが、一応書いておきます。 .. csv-table:: :widths: 36, 24 priority.CRITICAL, 30 priority.HIGH, 20 priority.MEDIUM, 10 priority.LOW, 0 priority.EXCLUDE, -10 注意が必要なのは、列名は正確にデータファイルに出力される名前でなければならないということです。 例えばtargetの出現時刻の列を指定したいのなら、targetと書くのではなくtarget.startedと書かないといけません。 あと、優先度が同じもの同士は筆者が確認した範囲では辞書の逆順に並んでいるようです。 **[時刻のフォーマット]** は、現時点(2024.1.1)ではログファイルに出力される時刻の形式を選択するもののようです。 例えば **[時刻のフォーマット]** が「実験開始時から」だと .. code-block:: 0.0280 EXP target: autoDraw = True 0.0280 EXP frame: autoDraw = True 1.0253 EXP target: autoDraw = False 1.0253 EXP frame: autoDraw = False のように出力されますが、「実時間」にすると .. code-block:: 2024-04-22_10:37:37.565335 EXP target: autoDraw = True 2024-04-22_10:37:37.565335 EXP frame: autoDraw = True 2024-04-22_10:37:38.551738 EXP target: autoDraw = False 2024-04-22_10:37:38.551738 EXP frame: autoDraw = False のように出力されます。「実験開始から」が従来の動作です。 翻訳の問題 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 「スクリーン」タブの **[色]** が **[背景色]** に変更されたのはすでに述べた通りですが、他にもLoopのプロパティの **[繰り返し条件]** が **[条件]** に変更されました。 原語は"Conditions"で変更ないのですが、CounterBalanceルーチンの追加により"Conditions"が必ずしも繰り返しの条件を指定するものではなくなったためです。