Script Author: Katja Borchert, Ph.D. (katjab@millisecond.com), Millisecond
Created: January 05, 2022
Last Modified: January 09, 2025 by K. Borchert (katjab@millisecond.com), Millisecond
Script Copyright © Millisecond Software, LLC
This script implements Millisecond's version of the NASA developed 'Pointing Task', a measure of manual dexterity.
The NASA developed tasks can be downloaded as a free app from the Apple App Store.
Note the script runs with proportional sizing by default. Researchers can select to run the task with an absolute screen size to ensure that distances stay the same across devices. See section Defaults for more info.
Disclaimer: the NASA ipad App data/implementation may differ from the one collected by the Inquisit script.
Bettina L. Beard (2020). The Cognition and Fine Motor Skills Test Batteries: Normative Data and Interdependencies Technical Memorandum (TM) 20205008023. https://ntrs.nasa.gov/citations/20205008023 Public Access
7 - 8 minutes
Participants view a circle of 16 squares. Starting with the top squares, the squares get highlighted and participants have to press the highlighted squares as fast as possible. Each square in the sequence is 'joined' with its opposite square in such a way that once a square is highlighted, the next square participants have to press will be the square on the opposite side in the circle. An arrow indicates the direction in which the squares are highlighted: clock - or counterclockwise.
Clockwise example: [12 o'clock -> 6 o'clock] -> [1 o'clock -> 7 o'clock] -> [2 o'clock -> 8 o'clock]....
Counterclockwise example: [12 o'clock -> 6 o'clock] -> [11 o'clock -> 5 o'clock] -> [10 o'clock -> 4 o'clock]....
By default, this script runs 4 different conditions with 1 repetition per condition:
2 circle radii x 2 directions (clockwise vs. counterclockwise) x 1 reps
The order of the resulting 4 conditions is selected at random.
Each condition runs 5 blocks of 18 trials each (20 blocks total), followed by a self-paced break.
By default, participants receive optional performance feedback at script conclusion.
Check section 'Editable Parameters' for parameters that control
- circle diameter conditions to run
- rotation (clockwise, counterclockwise) conditions to run
- block/trial/repetition numbers
- performance feedback settings
- automated task demo
You can easily customize the experimental design by changing them.
provided by Millisecond - can be edited under section 'Editable Stimuli'
provided by Millisecond - can be edited under section 'Editable Instructions'.
The instructions are based on Beard (2020, p.58 - Appendix D)
File Name: pointingtask_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 |
Parameters |
|
| pointingMechanism | "finger" vs. "stylus" |
| pointingHand | "dominant" vs. "nondominant" vs. "left" vs. "right" |
| runDiameter1 | True (1) or false (0) |
| runDiameter2 | True (1) or false (0) |
| runClockwise | True (1) of false (0) |
| runCounterClockwise | True (1) of false (0) |
| repetitionsPerCondition | Number of repetitions per condition |
Display Information |
|
| display.canvasHeight | The height of the active canvas ('canvas') in pixels |
| display.canvasWidth | The width of the active canvas ('canvas') in pixels |
| pxPerMM | The conversion factor to convert pixel data into mm-results for the current monitor ( the higher resolution of the current monitor the more pixels cover the same absolute screen distance) This factor is needed if you want to convert pixel data into absolute mm data |
| canvasHeightMM | The width of the active canvas in mm |
| canvasWidthMM | The height of the active canvas in mm |
| circleDiameter1PX | The circle1 diameter in canvas pixels |
| circleDiameter1MM | The circle1 diameter in mm size |
| circleDiameter2PX | The circle2 diameter in canvas pixels |
| circleDiameter2MM | The circle2 diameter in mm size |
Latency Data |
|
| medianRTR1 | Median RT (in ms) for radius1 condition trials (across clockwise and counterclockwise direction) |
| zRTR1 | Z-score of medianRTR1 u(sing norming data from Beard (2020, p.22) for fingers only see Beard (2020, Appendix F, p.67/68) for a complete overview of their results For the pointing task 1. it didn't seem to matter whether to run 1 or 2 repetitions 2. it didn't seem to matter whether to use fingers or stylus 3. it didn't seem to matter whether to use the long version or the short version 4. the radius of the circle mattered => this z-score computation assumes that the boxes were approx. 2 cm (Millisecond's assumption. Beard (2020) refers to 'in' - however a circle with boxes 2 inches apart from each other wouldn't fit on an ipad) away from each other Norming sample described in Beard (2020, p.8) Keep in mind: The norming sample may not be the appropriate comparison group for your participants and/or study design |
| pRTR1 | Percentile of zRTR1 !The norming sample may not be the appropriate comparison group for your participants and/or study design! |
| medianRTR2 | Median RT (in ms) for radius2 condition trials (across clockwise and counterclockwise direction) |
| zRTR2 | Z-score of medianRTR2 u(sing norming data from Beard (2020, p.22) for fingers only see Beard (2020, Appendix F, p.67/68) for a complete overview of their results For the pointing task 1. it didn't seem to matter whether to run 1 or 2 repetitions 2. it didn't seem to matter whether to use fingers or stylus 3. it didn't seem to matter whether to use the long version or the short version 4. the radius of the circle mattered => this z-score computation assumes that the boxes were approx. 1.5 cm (Millisecond's assumption. Beard (2020) refers to 'in' - however a circle with boxes 1.5 inches apart from each other wouldn't fit on an ipad) away from each other Norming sample described in Beard (2020, p.8) Keep in mind: The norming sample may not be the appropriate comparison group for your participants and/or study design |
| pRTR2 | Percentile of zRTR2 !The norming sample may not be the appropriate comparison group for your participants and/or study design! |
By Direction |
|
| medianRT1C | Median RT (in ms) in clockwise, circle1 condition across all blocks for radius 1 condition median RT = median time (in ms) it took for participant to successfully complete a trial (=successful up response from target box) |
| medianRT1CC | Median RT (in ms) in counterclockwise, circle1 condition across all blocks for radius 1 condition |
| medianRT2C | Median RT (in ms) in clockwise, circle2 condition across all blocks for radius 2 condition |
| medianRT2CC | Median RT (in ms) in counterclockwise, circle2 condition across all blocks for radius 2 condition |
Pixel Error Data: Across Clockwise And Counterclockwise Direction |
|
| medianPixelErrorR1 | Median pixel errors in circle1 condition |
| medianPixelErrorR2 | Median pixel errors in circle2 condition |
By Direction |
|
| medianPixelError1C | Median pixel errors in clockwise, circle1 condition across all blocks |
| medianPixelError1CC | Median pixel errors in counterclockwise, circle1 condition across all blocks |
| medianPixelError2C | Median pixel errors in clockwise, circle2 condition across all blocks |
| medianPixelError2CC | Median pixel errors in counterclockwise, circle2 condition across all blocks |
File Name: pointingtask_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 |
Parameters |
|
| pointingMechanism | "finger" vs. "stylus" |
| pointingHand | "dominant" vs. "nondominant" vs. "left" vs. "right" |
| runDiameter1 | True (1) or false (0) |
| runDiameter2 | True (1) or false (0) |
| runClockwise | True (1) of false (0) |
| runCounterClockwise | True (1) of false (0) |
| repetitionsPerCondition | Number of repetitions per condition |
Display Information |
|
| display.canvasHeight | The height of the active canvas ('canvas') in pixels |
| display.canvasWidth | The width of the active canvas ('canvas') in pixels |
| pxPerMM | The conversion factor to convert pixel data into mm-results for the current monitor ( the higher resolution of the current monitor the more pixels cover the same absolute screen distance) This factor is needed if you want to convert pixel data into absolute mm data |
| canvasHeightMM | The width of the active canvas in mm |
| canvasWidthMM | The height of the active canvas in mm |
| circleDiameter1PX | The circle1 diameter in canvas pixels |
| circleDiameter1MM | The circle1 diameter in mm size |
| circleDiameter2PX | The circle2 diameter in canvas pixels |
| circleDiameter2MM | The circle2 diameter in mm size |
Raw Data: Trial By Trial |
|
| 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) |
| 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. |
| conditionCounter | Counts the number of conditions run |
| blockCounter | Counts the number of blocks run per condition |
| currentCondition | 1 = diameter1, clockwise; 2 = diameter1, counterclockwise 3 = diameter2, clockwise; 4 = diameter2, counterclockwise |
| conditionRepetition | Number of times the current condition has been presented |
| direction | 1 = clockwise; 2 = counterclockwise |
| circleCondition | 1 = circle1 diameter; 2 = circle2 diameter |
| circleDiameterPct | The percentage height of the current circle diameter (relative to canvas height) |
| trialCount | Custom trialcounter (per block) a trial ends with the lift-up movement of the current target box and a new trial is initiated right away. A trial in this implimentation can span several responses that will be noted in the data file. |
| box | The number of the current target box (1-16) the top box is number 12 and numbering continues clockwise (just like an analog clock face) |
| respStatus | Down = first touch down on target box down-corrected = touch down on target box after a previous error down response down-outside = an error touch down somewhere outside the boxes down-wrg-box,X = an error touch down on an incorrect box (X = box number) up-inside = an up response from inside the target box (this response ends a trial) up-outside = an up response from an error location |
Custom Accuracy Measure |
|
| acc | 1 = the current up response is from within target box 0 = any other response |
Custom Latency Measures |
|
| respRTMS | The time (in ms) that passed from last response to current one the first down response in a block will be at 0 because there is no other previous response |
| sumRespRTMS | The continuous sum of all RespRTMS |
| trialRTMS | The duration (in ms) of the trial; measured from start of trial until the correct up-response from the target box the first trial in a block starts with the first down response, thus trialRTMS of the first trial (trialCount = 1) is likely shorter and is NOT considered for summary statistics. |
Coordinate Measures |
|
| mouse.x | The x coordinate of the finger at the time of the currently measured response |
| mouse.y | The y coordinate of the finger at the time of the currently measured response |
| targetBoxXPX | The x-coordinate of the current target box center |
| targetBoxYPX | The y-coordinate of the current target box center |
| errorXPX | The difference btw. (targetboxXPX - mouse.x) positive = finger touched down to the left of target box center negative = finger touched down to the right of target box center |
| errorYPX | The difference btw. (targetboxYPX - mouse.y) positive = finger touched down above the target box center negative = finger touched down below target box center |
| errorPX | The pixels by which the ERROR DOWN-response missed the target box => IF (leftborder of targetbox <= errorXPX <= rightborder of targetbox) => errorYPX represent the missed pixels (basically going straight up or down would have hit the box) => IF (topborder of targetbox <= errorYPX <= bottomborder of targetbox) => errorXPX represent the missed pixels (basically going straight left or right would have hit the box) => in any other case, the hypothenuse of sqrt = [pow(errorXPX,2) + pow(errorYPX,2)] represents the missed pixels |
| errorDistanceFingerTargetPX | Measured for each ERROR DOWN-response the pixel distance from the touch response to the CENTER of the target box |
| targetDistancePX | The ideal pixel distance from center of previous box to target box |
| actualDistancePX | The actual pixel distance from center of previous box at FIRST touchdown |
| downResponseCount | Counts the number of down responses made during the current trial |
| upResponseCount | Counts the number of up responses made during the current trial only the up-response from within the target box ends a trial (see 'respStatus'), up until then participant can make many down and up responses |
Inquisit Built-In Variables |
|
| response | The response of participant (scancode of response button) 'lButtonDown' => touchdown 'lButtonUp' => lift-up response |
| correct | Correctness of response 1 = participant lifts finger off the target box 0 = any other response |
| latency | Continuous trial latency (in ms); measured from: onset of blue box until lift-off response from target box (= trial end) the last up-response in a trial shows the complete trial duration in ms |
The procedure can be adjusted by setting the following parameters.
| Name | Description | Default |
|---|---|---|
Design |
||
| pointingMechanism | Choose from: "finger" vs. "stylus" if "finger", the index finger is assumed | "finger" |
| pointingHand | Choose from: "dominant", "non-dominant", "left", "right" | "dominant" |
| skipPerformanceFeedback | True: participants won't receive any performance feedback at the end false: participants will receive performance feedback at the end | false |
| runDemo | True: the script runs an demonstration of the task (clockwise demonstration) false: the script skips the demonstration (e.g. if task administrator wants to demonstrate themselves) | true |
| runDiameter1 | True = run the task with Diameter 1 false = skip Diameter 1 | true |
| runDiameter2 | True = run the task with Diameter 2 false = skip Diameter 2 | true |
| runClockwise | True = run the task with clockwise rotations false = skip the clockwise rotation trials | true |
| runCounterClockwise | True = run the task with counter-clockwise rotations false = skip the clockwise counter-rotation trials | true |
| repetitionsPerCondition | The number of repetitions for each condition (Example of a condition would be: 'diameter1, clockwise') in this script: conditions repeat once they have all run | 1 |
| numberOfBlocksPerCondition | The number of blocks run in diameter1-clockwise, diameter1-counterclockwise,diameter2-clockwise, diameter2-counterclockwise, | 5 |
| trialsPerBlock | The number of trials run per block | 18 |
Color Parameter |
||
| canvasColor | Display color of the actively used portion of the screen (the 'canvas') if set to a color other than the screenColor, you can distinguish the active canvas from the inactive portion of the screen | lightGray |
| screenColor | Color of the screen not used by the canvas ('inactive screen') | lightGray |
| defaultTextColor | Default color of text items | black |
Sizing Parameters |
||
| circleDiameter1Pct | The circle1 diameter in canvas height percentage the circle1 diameter equals the distance btw. opposite boxes | 75% |
| circleDiameter2Pct | The circle2 diameter in canvas height percentage the circle2 diameter equals the distance btw. opposite boxes | 55% |
| boxHeightPct | The height of the boxes in canvas height percentage | 8% |
Timing Parameters |
||
| getReadyDurationMS | Duration (in ms) of getReady trial | 1000 |