Script Author: Katja Borchert, Ph.D. (katjab@millisecond.com), Millisecond
Created: January 05, 2025
Last Modified: January 17, 2025 by K. Borchert (katjab@millisecond.com), Millisecond
Script Copyright © Millisecond Software, LLC
This script implements Millisecond's version of an Adaptive Tracking Task originally proposed by Borland & Nicholson (1984) to measure visuomotor coordination and vigilance.
In contrast to the Inquisit Pursuit Rotor Task, in which the speed of the circle is predictable in its speed and movement pattern, the direction of the moving circle in the Adaptive Tracking Task is unpredictable and its speed is continuously updated based on a participant's performance.
The default settings of the Inquisit Adaptive Tracking are set for running the task on an ipad sized touchscreen. If a touchscreen is detected, the mouse cursor is turned off and participants need to engage with the task using fingers/stylus pens as the tracking device. On non-touchscreens, the mouse cursor is turned on and participants need to engage with the task using the computer mouse to track the circle.
Borland, R. G., Nicholson, A. N. Visual motor co-ordination and dynamic visual acuity. Br J Clin Pharmacol. 18, Suppl 1. 69S-72S (1984).
Foulkes, A. J. M., & Miall, R. C. (2000). Adaptation to visual feedback delays in a human manual tracking task. Experimental Brain Research, 131(1), 101–110. https://doi.org/10.1007/s002219900286
WALES, R., & BLAKE, R. R. (1970). Rule for Obtaining 75% Threshold with the Staircase Method. Journal of the Optical Society of America (1930), 60(2), 284. https://doi.org/10.1364/JOSA.60.0284_1
5 minutes
Participants are asked to track an unpredictable, moving yellow circle on the screen with their finger or stylus (or mouse cursor on non-touchscreens) for 4 minutes. The speed of the yellow circle is continuously updated based on a participant's ability to keep their finger/stylus on the yellow circle.
(1) Screen Size Check: the script checks that the current screen is large enough for the default settings of the
script (here: 19.2cmx14.4cm)
(2) Practice: default for 30seconds
Runs the tracking test for 30seconds (see section Editable Parameters for timing)
(3) Adaptive Testing Block: default for 4 minutes (see section Editable Parameters for timing)
Each tracking block runs several trial elements (trial.tracking):
- each trial.tracking runs an animated stimulus that travels from one (inflection) point (P1) to the next (P2), at a
a pre-determined speed. The duration of each trial.tracking depends on the pixel distance that the dot needs to
travel and the current speed
=> The more pixels need to be traveled, the longer the trial (so the animation speed appears consistent).
provided by Millisecond
provided by Millisecond - can be edited in script adaptivetrackingtask_instructions_inc.iqjs
File Name: adaptivetrackingtask_summary*.iqdat
| Name | Description |
|---|---|
| inquisit.version | Inquisit version number |
| computer.platform | Device platform: win | mac |ios | android |
| 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 script was run |
| starttime | Time script was started |
| subjectid | Assigned subject id number |
| groupid | Assigned group id number |
| sessionid | Assigned session id number |
| elapsedtime | Time it took to run script (in ms); measured from onset to offset of script |
| completed | 0 = Test was not completed 1 = Test was completed |
| display.height | The height of the current screen in pixels |
| display.canvasHeight | The height of the current active canvas in pixels (active canvas = part of the screen used to run the script) |
| display.refreshInterval | The refreshinterval (in ms) of the current display |
| expressions.pxPerMM | Px/mm conversion number for the current display |
| targetRadiusPX | Radius of target circle in pixels |
| propCorrect | Proportion of test trials that were considered 'correct' (finger/mouse was ON target 85% or above) given that this task is adaptive, the propCorrect should be relatively similar across participants and converge somewhere around 65%-70% |
| meanSpeedPXPerMS | The mean speed in px/ms |
| meanSpeedMMPerMS | The mean speed in mm/ms |
| meanSpeedPctPerMS | The mean speed in pct/ms |
| meanTargetDistancePX | The mean target distance btw. participant's coordinates and circle center (calculated as Euklidean distances) in pixels |
| meanTargetDistanceMM | The mean target distance btw. participant's coordinates and circle center (calculated as Euklidean distances) in mm |
| meanTargetDistancePct | The current mean target distance btw. participant's coordinates and circle center (calculated as Euklidean distances) in percentages (screen height percentages) |
| countLiftOffs | Only relevant for touchscreens: counts the number of times participants lifted finger/stylus from the screen (mouse cursor will stay on the screen even if participants lifts finger from mouse button) |
File Name: adaptivetrackingtask_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 |
| display.height | The height of the current screen in pixels |
| display.canvasHeight | The height of the current active canvas in pixels (active canvas = part of the screen used to run the script) |
| display.refreshInterval | The refreshinterval (in ms) of the current display |
| expressions.pxPerMM | Px/mm conversion number for the current display |
| targetRadiusPX | Radius of target circle in pixels |
| 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. |
| startSpeedPctPerMS | The starting speed in pct/ms (PARAMETER) |
| startSpeedPXPerMS | The starting speed in px/ms |
| startSpeedMMPerMS | The starting speed in mm/ms |
| stepsizePX | The stepsize in px/ms |
| stepsizeMM | The stepsize in mm/ms |
| response | The response of participant during tracking, only response 'liftOff' will be noted in the data file. |
| correct | Correctness of response trial.tracking: at the end of trial.tracking, the proportion of recorded OFF-target responses is categorized in two binary categories error (0): more than 75% of recorded responses were OFF target correct (1): 25% or fewer recorded responses were OFF target |
| latency | Response latency (in ms); does not apply to trial.tracking by design; latency is always as long as values.trialDuration and is independent of participants' responses |
| timeStampTrackingStart | Rough timestamp of the start of the tracking procedure |
| trialCounter | Tracks the number of trials (trials = movement from one inflection point to the next) |
| x1 | The starting horizontal pixel coordinate of the circle |
| y1 | The starting vertical pixel coordinate of the circle |
| x2 | The ending horizontal pixel coordinate of the circle |
| y2 | The ending vertical pixel coordinate of the circle |
| changeDistance | The Euklidean distance from beginning to end point in pixels |
| trialDuration | The calculated duration of the trial (duration of animation) |
| speed | The speed of the current circle (in px/ms) |
| list.trialOffTimes.mean | The proportion of times participant's coordinates have been recorded off the circle during the current trial |
| adjust | 0 = no speed adjustment; 1 = speed adjusted for next trial |
| nextSpeed | The adjusted speed (if any) at the end of the trial |
| meanSpeedPXPerMS | The current mean speed in px/ms |
| meanSpeedMMPerMS | The current mean speed in mm/ms |
| meanSpeedPctPerMS | The current mean speed in pct/ms |
| meanTargetDistancePX | The current mean target distance btw. participant's coordinates and circle center (calculated as Euklidean distances) in pixels |
| meanTargetDistanceMM | The current mean target distance btw. participant's coordinates and circle center (calculated as Euklidean distances) in mm |
| meanTargetDistancePct | The current mean target distance btw. participant's coordinates and circle center (calculated as Euklidean distances) in percentages (screen height percentages) |
| countLiftOffs | Only relevant for touchscreens: counts the number of times participants lifted finger/stylus from the screen (mouse cursor will stay on the screen even if participants lifts finger from mouse button) |
File Name: adaptivetrackingtask_stream*.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 |
| display.height | The height of the current screen in pixels |
| display.canvasHeight | The height of the current active canvas in pixels (active canvas = part of the screen used to run the script) |
| display.refreshInterval | The refreshinterval (in ms) of the current display |
| expressions.pxPerMM | Px/mm conversion number for the current display |
| blockCode | Name of the current block |
| trialCode | Name of the current trial |
| elapsedTime | Session duration in ms |
| trialCounter | Tracks the number of trials (trials = movement from one inflection point to the next) run in the current block |
| speed | Current speed (in px/ms) |
| trialDuration | The current trialDuration (in ms) |
| x1 | The starting horizontal pixel coordinate of the circle |
| y1 | The starting vertical pixel coordinate of the circle |
| x2 | The ending horizontal pixel coordinate of the circle |
| y2 | The ending vertical pixel coordinate of the circle |
| mouse.x | The current horizontal cursor/finger coordinate in pixels |
| mouse.y | The current vertical cursor/finger coordinate in pixels |
| shape.dotAnimated.x | The current horizontal pixel coordinate of the moving circle |
| shape.dotAnimated.y | The current vertical pixel coordinate of the moving circle |
| offTarget | 1 = the participant's coordinates are OFF the target at time of recording 0 = the participant's coordinates are ON the target at time of recording |
| targetDistancePX | The Euklidean distance (in px) btw. center of circle and participant's coordinates at time of recording |
| targetRadiusPX | The radius (in px) of the circle |
| errorPX | The calculated errors (in px); calculated as IF (targetDistance > targetRadius){error = targetDistance-targetRadius) Example 1. targetRadius = 80px, distance = 90px => error = 90px-80px = 10px 2. targetRadius = 80px, distance = 60px => error = 0px (coordinates are on the circle) |
| countLiftOffs | Only relevant for touchscreens: counts the number of times participants lifted finger/stylus from the screen (mouse cursor will stay on the screen even if participants lifts finger from mouse button) |
The procedure can be adjusted by setting the following parameters.
| Name | Description | Default |
|---|---|---|
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 | black |
| screenColor | Color of the screen not used by the canvas ('inactive screen') | gray |
| defaultTextColor | Default color of text items | white |
Sizing Parameters |
||
| targetDiameterPct | Percentual size of the target diameter (relative to canvasHeight) | 10% |
| amplitude | The fixed amplitude used for the 5 non-harmonious sinusoidal wave functions to generate the random target movement (possible range: 0.2-0.9) The amplitude in this script controls the (predictable) distances btw. inflection points in the target's movement pattern => The higher the amplitude, the longer the distances traveled from one inflection point to the next inflection point here: the points where the dot may randomly change its direction (and speed) in this script an amplitude of 1 would mean that a point can move 1/2 the screen in one predictable movement | 0.6 |
Speed Adjustment |
||
| startSpeedPctPerMS | The starting speed (in canvasHeight pct/ms) that is used to travel from one inflection point to the next 0.015% vertical height per ms => the target moves 0.015% of the canvasHeight per ms for ABSOLUTE screen sizes (default), this translates to 0.0216mm/ms => 2.16 cm/s | 0.015 |
| stepSize | Adjustment steps (in pct/mm) | 0.001 |
Task Design Elements |
||
| timeoutPracticeMS | The duration (in ms) of the practice round | 30000 |
| timeoutTestMS | The duration (in ms) of the test round | 240000 |
| minOnTargetPropCorrect | The minimum proportion of ON target measures per trial that results in a 'correct' trial performance evaluation | 0.85 |
Miscellaneous |
||
| skipScreenSizeCheck | False = screenSize check is run ( screen size is checked for minimum size of 192mmx144mm) true = screenSize is NOT checked | false |