Script Author: Katja Borchert, Ph.D. (katjab@millisecond.com), Millisecond
Created: January 04, 2022
Last Modified: January 02, 2025 by K. Borchert (katjab@millisecond.com), Millisecond
Script Copyright © Millisecond Software, LLC
This script implements Millisecond's version of the 'Box Task' by Kessels & Postma (2018). The 'Box Task' is a Visuospatial Memory Task originally written in Microsoft Visual Basic and runs on Windows machines. It allows the computation of different error scores that measure specific working memory processes (i.e., the number of within-search and between-search errors). The original Box Task program by Kessels & Postma provides a stimulus set and a default experimental setup but also allows further customizations of the task.
DISCLAIMER: The Inquisit implementation is based on Kessel & Postma's (2017) description of the 'Box Task'. Millisecond attempts to replicate the general memory task but differences between the implementations will exist.
The Inquisit implementation runs on Windows, Macs, Androids and Ios and can be run online. It thus expands the number of devices/platforms the 'Box' Task can be run on. As the original 'Box Task', the Inquisit implementation provides stimuli and a default setup and allows for some customization of the task via parameter settings.
The script provides the functionality to run the script with absolute stimuli sizing. Default settings default back to proportional sizing. Go to 'defaults' setting for more info.
Kessels RPC, Postma A. The Box Task: A tool to design experiments for assessing visuospatial working memory. Behav Res Methods. 2018 Oct;50(5):1981-1987. doi: 10.3758/s13428-017-0966-7. PMID: 28916951.
7 minutes
N-objects are hidden in N boxes and participants have to find them by opening boxes. Participants are told which specific object to look for next ('target'). If the target box is opened, the program shows the target object for a short period of time before closing the box again. Once found, all objects stay in their boxes, but all boxes will be closed during the search. Thus, if a box is opened that does not contain the target object, it either shows one of the already found objects or it appears empty. Box locations stay the same throughout each run.
The default setup of this Inquisit script runs 2 practice rounds (with 3 boxes each), followed by two rounds of 4, 6 and 8 boxes each. The maximum number of boxes that can be run is 10 in the Inquisit script. The individual objects and boxes as well as box locations are randomly determined for each round in this script.
the script provides 42 different objects to run with the default set-up without repeating any objects.
The default setup of the Millisecond Box Task runs
(1) Intro Block: repeatable if necessary
(2) Practice Block: runs 2 practice rounds with 3 objects each
(3) Test Block: runs 6 rounds with
- 2 rounds for 4 objects
- 2 rounds for 6 objects
- 2 rounds for 8 objects ( the highest setsize the Millisecond Box Task can run is 10)
provided by Millisecond - can be edited under section 'Editable Stimuli'
provided by Millisecond - can be edited under section 'Editable Instructions'
The instructions use some of the suggested instructions by Kessels & Postma (2018)
File Name: ms_boxtask_summary*.iqdat
| Name | Description |
|---|---|
| inquisit.version | Inquisit version number |
| computer.platform | Device platform: win | mac |ios | android |
| computer.touch | 0 = device has no touchscreen capabilities; 1 = device has touchscreen capabilities |
| computer.hasKeyboard | 0 = no external keyboard detected; 1 = external keyboard detected |
| startDate | Date the session was run |
| startTime | Time the session was run |
| subjectId | Participant ID |
| groupId | Group number |
| sessionId | Session number |
| elapsedTime | Session duration in ms |
| completed | 0 = Test was not completed 1 = Test was completed |
| meanNumberCorrectSearchesPractice | Mean number of correct target searches per practice round (default setup run setsize = 3) correct = the search for a target was conducted without between or within errors |
N=1 |
|
| meanNumberCorrectSearchesSetSize1 | Mean number of correct target searches per round testing setsize1 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize1 | The number of timed out (TO) rounds for setsize1 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize1 | Mean number of Within errors per non-timed out setsize1 rounds |
| meanErrorCountBetweenSetSize1 | Mean number of Between errors per non-timed out setsize1 rounds |
N=2 |
|
| meanNumberCorrectSearchesSetSize2 | Mean number of correct target searches per round testing setsize2 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize2 | The number of timed out (TO) rounds for setsize2 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize2 | Mean number of Within errors per non-timed out setsize2 rounds |
| meanErrorCountBetweenSetSize2 | Mean number of Between errors per non-timed out setsize2 rounds |
N=3 |
|
| meanNumberCorrectSearchesSetSize3 | Mean number of correct target searches per round testing setsize3 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize3 | The number of timed out (TO) rounds for setsize3 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize3 | Mean number of Within errors per non-timed out setsize3 rounds |
| meanErrorCountBetweenSetSize3 | Mean number of Between errors per non-timed out setsize3 rounds |
N=4 |
|
| meanNumberCorrectSearchesSetSize4 | Mean number of correct target searches per round testing setsize4 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize4 | The number of timed out (TO) rounds for setsize4 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize4 | Mean number of Within errors per non-timed out setsize4 rounds |
| meanErrorCountBetweenSetSize4 | Mean number of Between errors per non-timed out setsize4 rounds |
N=5 |
|
| meanNumberCorrectSearchesSetSize5 | Mean number of correct target searches per round testing setsize5 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize5 | The number of timed out (TO) rounds for setsize5 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize5 | Mean number of Within errors per non-timed out setsize5 rounds |
| meanErrorCountBetweenSetSize5 | Mean number of Between errors per non-timed out setsize5 rounds |
N=6 |
|
| meanNumberCorrectSearchesSetSize6 | Mean number of correct target searches per round testing setsize6 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize6 | The number of timed out (TO) rounds for setsize6 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize6 | Mean number of Within errors per non-timed out setsize6 rounds |
| meanErrorCountBetweenSetSize6 | Mean number of Between errors per non-timed out setsize6 rounds |
N=7 |
|
| meanNumberCorrectSearchesSetSize7 | Mean number of correct target searches per round testing setsize7 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize7 | The number of timed out (TO) rounds for setsize7 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize7 | Mean number of Within errors per non-timed out setsize7 rounds |
| meanErrorCountBetweenSetSize7 | Mean number of Between errors per non-timed out setsize7 rounds |
N=8 |
|
| meanNumberCorrectSearchesSetSize8 | Mean number of correct target searches per round testing setsize8 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize8 | The number of timed out (TO) rounds for setsize8 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize8 | Mean number of Within errors per non-timed out setsize8 rounds |
| meanErrorCountBetweenSetSize8 | Mean number of Between errors per non-timed out setsize8 rounds |
N=9 |
|
| meanNumberCorrectSearchesSetSize9 | Mean number of correct target searches per round testing setsize9 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize9 | The number of timed out (TO) rounds for setsize9 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize9 | Mean number of Within errors per non-timed out setsize9 rounds |
| meanErrorCountBetweenSetSize9 | Mean number of Between errors per non-timed out setsize9 rounds |
N=10 |
|
| meanNumberCorrectSearchesSetSize10 | Mean number of correct target searches per round testing setsize10 correct = the search for a target was successful and no between, within or timeout errors were made |
| countTOSetSize10 | The number of timed out (TO) rounds for setsize10 (if task was run without timeout this should be 0) |
| meanErrorCountWithinSetSize10 | Mean number of Within errors per non-timed out setsize10 rounds |
| meanErrorCountBetweenSetSize10 | Mean number of Between errors per non-timed out setsize10 rounds |
File Name: ms_boxtask_raw*.iqdat
| Name | Description |
|---|---|
| build | Inquisit version number |
| computer.platform | Device platform: win | mac |ios | android |
| computer.touch | 0 = device has no touchscreen capabilities; 1 = device has touchscreen capabilities |
| computer.hasKeyboard | 0 = no external keyboard detected; 1 = external keyboard detected |
| date | Date the session was run |
| time | Time the session was run |
| subject | Participant ID |
| group | Group number |
| session | Session number |
| blockcode | The name the current block (built-in Inquisit variable) |
| blocknum | The number of the current block (built-in Inquisit variable) |
| trialcode | The name of the currently recorded trial (built-in Inquisit variable) trial.searchEnd currently stores the summary of a target search. |
| trialnum | The number of the currently recorded trial (built-in Inquisit variable) trialnum is a built-in Inquisit variable; it counts all trials run even those that do not store data to the data file. trial.searchEnd currently stores the summary of a target search. |
| response | The response of participant during current trial |
| correct | Correctness of response (1 = correct, 0 = error) |
| latency | Response latency (in ms) |
| phase | "practice" vs. "test" |
| roundCounter | A counter that tracks how many rounds have been run in the current phase |
| setSize | The currently tested setsize |
| selectBoxImage | The itemnumber of the current box image |
| targetBoxes | A variable that stores all the target boxes used per round (in the order the target box was selected) |
| newTarget | 1 = a new target was chosen for the last search 0 = participant continued a target search |
| countTargets | Counter that updates the number of targets searched for per round |
| countAttemptsPerTarget | Counter that updates how many boxes were opened to find current target |
| targetObject | Stores the image file for the current target object |
| targetBox | Stores the number of the box that currently hides the target object |
| selectedBox | Stores the number of the last box that was selected to open |
| success | 1 = target object was found in the last selected box; 0 = otherwise |
| selectionOrder | Stores the order in which the boxes were opened |
| searchAcc | 1 = the current target object was found without making any within or between errors 0 = otherwise |
| countErrorsBetween | Counts the number of times participant selected a box that contained an 'old' target (one previously found) and thus could not contain the current target object (reset for each new target object) |
| countErrorsWithin | Counts the number of times participants opened a non-target box already checked (and rejected) for the current target (reset for each new target object) repeatedly opening the same non-target box that contains an old target is counted as both a 'between' error AND a 'within' error. totalErrorsBetweenPerRound: sums up all between-errors made during the current round |
| totalErrorsWithinPerRound | Sums up all within-errors made during the current round |
| searchTimeIns | Stores the search time spent on this round (in s) |
| selectionTimestamps | A storage variable that stores the search timestamps of all selected boxes relative to start of current round Example: '1@1.70 2@3.70' => box1 was opened at 1.7s after roundstart => box2 was opened at 3.7s after roundstart |
| timedOut | Timed out rounds record 1 during trial.timedoutFeedback (otherwise the column should be empty) |
| roundTimeout | The current round timeout (in ms) |
| boxPlacementViolation | 1 (true) = at least one box violated the placement constraint (overlap possible) 0 (false) = no placement violations detected |
| countBoxPlacementViolations | Number of violations |
The procedure can be adjusted by setting the following parameters.
| Name | Description | Default |
|---|---|---|
Screencolor Parameters |
||
| screenColor | The color of the inactive part of the screen | lightBlue |
| defaultTextColor | The default text color | black |
| activeCanvasColor | The color of the part of the screen actively used for this script | lightBlue |
| boxPlacementAreaColor | The part of the screen used for box placements will appear white | white |
Sizing Parameters |
||
| boxHeightPct | Proportional sizing (relative to canvas height) of the boxes | 15% |
| objectHeightPct | Proportional sizing (relative to canvas height) of the object images | 12% |
Timing Parameters |
||
| targetReminderOnsetMS | If a new target is presented and no response occurs within a certain time frame, the script sends a reminder | 5000 |
| revealDurationMS | The duration (in ms) that empty boxes are open | 1000 |
| rUntimedRounds | True = the search during a round is timed false = the search during a round is untimed | false |
Only Relevant For Timedsearches |
||
| responseTimeoutMS | This script calculates the maximum number of boxes that may have to be opened without making within or between errors to find all objects in a given round and multiplies that number by 'responseTimeoutMS' and adds the time dedicated to show open boxes to calculate the round timeout. For example 6 boxes => max. 21 boxes to open to find all target objects without error=> 21*responseTimeoutMS + 21*revealDurationMS = 21*1000 + 21*1000 = 42000ms to finish the round | 1000 |
| showTimer | True: during timed rounds, a timer clock is presented false: no timer clock is presented | true |
Sound Effects |
||
| skipSoundEffects | True: no sounds (success/failure) are played false: sound effects are played | true |