Script Author: Katja Borchert, Ph.D. (katjab@millisecond.com), Millisecond
Created: January 07, 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 'Dragging Task', which measures manual dexterity, or the speed of arm movements (Beard, 2020).
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
10 minutes
For the dragging task participants are asked to repeatedly drag a white square back and forth or up and down from one end of the screen ('gray wall') to the opposite one ('blue wall'). Once the blue wall has been reached, the square needs to be briefly dropped, the walls change color and the square can be dragged bag. The white square can be dragged with a finger, stylus or the mouse (on non-touch devices)
By default, this script runs 2 conditions (horizontal vs. vertical) with 1 repetition per condition:
The order of 2 conditions is selected at random.
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 the ones published in Beard (2020, p.58 - Appendix D)
File Name: draggingtask_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 |
| draggingMechanism | "finger" vs. "stylus" (parameter) |
| draggingHand | "dominant" vs. "nondominant" vs. "left" vs. "right" (parameter) |
| canvasHeightMM | The width of the active canvas in mm |
| canvasWidthMM | The height of the active canvas in mm |
| squareHeightMM | The size of the square in mm |
| distanceWallToWallMM | The distance between left (top) and right (bottom) wall (from center of wall to center of wall) in mm |
| wallWidthMM | The length of the short side of the wall in mm |
| wallHeightMM | The length of the long side of the wall in mm |
| 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 |
Latency Performance (Based On Draggingrt Only) |
|
| medianRTLR | Median time (in ms) it took participant to move from left to right (and drop off square in appropriate wall space) |
| meanRTLR | Mean time (in ms) it took participant to move from left to right (and drop off square in appropriate wall space) |
| sdRTLR | Standard deviation of mean time (in ms) it took participant to move from left to right (and drop off square in appropriate wall space) |
| medianRTRL | Median time (in ms) it took participant to move from right to left (and drop off square in appropriate wall space) |
| meanRTRL | Mean time (in ms) it took participant to move from right to left (and drop off square in appropriate wall space) |
| sdRTRL | Standard deviation of mean time (in ms) it took participant to move from right to left (and drop off square in appropriate wall space) |
| medianRTH | Median time (in ms) it took participant to move one side to the other in horizontal condition (and drop off square in appropriate wall space) |
| meanRTH | Mean time (in ms) it took participant to move one side to the other in horizontal condition (and drop off square in appropriate wall space) |
| sdRTH | Standard deviation of mean time (in ms) it took participant to move one side to the other (and drop off square in appropriate wall space) |
| medianRTTB | Median time (in ms) it took participant to move from top to bottom (and drop off square in appropriate wall space) |
| meanRTTB | Mean time (in ms) it took participant to move from top to bottom (and drop off square in appropriate wall space) |
| sdRTTB | Standard deviation of mean time (in ms) it took participant to move from top to bottom (and drop off square in appropriate wall space) |
| medianRTBT | Median time (in ms) it took participant to move from bottom to top (and drop off square in appropriate wall space) |
| meanRTBT | Mean time (in ms) it took participant to move from bottom to top (and drop off square in appropriate wall space) |
| sdRTBT | Standard deviation of mean time (in ms) it took participant to move from bottom to top (and drop off square in appropriate wall space) |
| medianRTV | Median time (in ms) it took participant to move one side to the other in vertical condition (and drop off square in appropriate wall space) |
| meanRTV | Mean time (in ms) it took participant to move one side to the other in vertical condition (and drop off square in appropriate wall space) |
| sdRTV | Standard deviation of mean time (in ms) it took participant to move one side to the other (and drop off square in appropriate wall space) |
Movement Performance (Divergence From Optimal Path In Pixels) |
|
| medianHOOptimalLineDivergenceDropoffPX | Median pixel distance from drop-off coordinate to optimal y-line in HO condition |
| meanHOOptimalLineDivergenceDropoffPX | Mean pixel distance from drop-off coordinate to optimal y-line in HO condition |
| sdHOOptimalLineDivergenceDropoffPX | Standarddeviation of the pixel distance from drop-off coordinate to the optimal y-line in HO condition |
| medianHOOptimalLineDivergenceMeanPX | Overall median distance (in canvas pixels) of the finger from the 'optimal' y-line (based on all trial means) |
| meanHOOptimalLineDivergenceMeanPX | Overall mean distance (in canvas pixels) of the finger from the 'optimal' y-line (averaged across all trial means) |
| meanHOOptimalLineDivergenceSDPX | The overall mean (in canvas pixels) of all the trial standarddeviations of the vertical distances btw. the finger and the 'optimal' y-line 'optimal' in this sense means the y-coordinate of the square at the start of the trial. Moving the square along this y-coordinate is the shortest (thus fastest) way btw. the walls. |
| medianVOOptimalLineDivergenceDropoffPX | Median pixel distance from drop-off coordinate to optimal x-line in VO condition |
| meanVOOptimalLineDivergenceDropoffPX | Mean pixel distance from drop-off coordinate to optimal x-line in VO condition |
| sdVOOptimalLineDivergenceDropoffPX | Standarddeviation of the pixel distance from drop-off coordinate to the optimal y-line in VO condition |
| medianVOOptimalLineDivergenceMeanPX | Overall median distance (in canvas pixels) of the finger from the 'optimal' x-line (based on all trial means) |
| meanVOOptimalLineDivergenceMeanPX | Overall mean distance (in canvas pixels) of the finger from the 'optimal' x-line (averaged across all trial means) |
| meanVOOptimalLineDivergenceSDPX | The overall mean (in canvas pixels) of all the trial standarddeviations of the vertical distances btw. the finger and the 'optimal' x-line 'optimal' in this sense means the x-coordinate of the square at the start of the trial. Moving the square along this x-coordinate is the shortest (thus fastest) way btw. the walls. (3) Mouse Coordinates file: 'draggingtask_stream*.iqdat' this data file stores data every ~17ms (=> records a line of data every ~17ms) |
| 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 |
| draggingMechanism | "finger" vs. "stylus" (parameter) |
| draggingHand | "dominant" vs. "nondominant" vs. "left" vs. "right" (parameter) |
| canvasHeightMM | The width of the active canvas in mm |
| canvasWidthMM | The height of the active canvas in mm |
| squareHeightMM | The size of the square in mm |
| distanceWallToWallMM | The distance between left (top) and right (bottom) wall (from center of wall to center of wall) in mm |
| wallWidthMM | The length of the short side of the wall in mm |
| wallHeightMM | The length of the long side of the wall in mm |
| 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) |
| blockCode | Name of the current block |
| blockNum | Number of the current block |
| trialCode | Name of the current trial |
| trialNum | Number of the current trial |
| trialCounter | Counts the number of trials in a block one trial: one right to left AND left to right swipe (same for vertical movement) |
| startComputing | 0 = the square has not been grabbed yet on the gray wall 1 = the square has been grabbed (though might still be on gray wall) and performance data should be collected from this point on |
Response Performance Metrics |
|
| rsp | 1 = a down or up response was made 0 = no down or up response was made |
| respStatus | The data file will note 'down' and 'up' responses down = participants moved the finger down to grab the square up-miss = the square was dropped somewhere on the canvas (but not on the target wall) up-partial-miss = the square was dropped partially on the target wall up-corrected = the square was correctly dropped on the target wall after previously making an a (partially) missed drop up = the square was correctly dropped on the target wall without any previous errors |
| respRTMS | The response time for the current response Example first 'down' response: by definition this response time is 0 as measurements start with grabbing the square for the first time on the gray wall all 'up' responses: RespRTMS will store the time it took from previously grabbing the square until dropping it at the current location 'down' (after error response): stores the time it took participant to grab the stimulus again after erroneously dropping it somewhere on the canvas Ideally, participants' records show one 'down' response, followed by an 'up' response. |
| sumRespRTMS | Sum of all RespRTMS in a block |
Pathway Performance Metrics |
|
| mouse.x | The current horizontal mousefinger coordinate |
| mouse.y | The current vertical mousefinger coordinate |
| lastDown | The critical down coordinate from the last down response horizontal dragging: the critical down coordinate is the x-coordinate vertical dragging: the critical down coordinate is the y-coordinate |
| dstPX | Calculates distance travelled from last 'down' response to current 'up' response horizontal dragging: the distance only takes into account horizontal coordinate changes vertical dragging: the distance only takes into account vertical coordinate changes |
Separate For Ho And Vo Condition |
|
| hoOptimallineYPX | The optimal y-coordinate (= y-coordinate of the white square at start of each trial) (= if participant does not diverge from this coordinate, they use the fastest way from A to B) this optimal line depends on where the square is dropped off. In this script it is NOT automatically the center line but is reset to the drop-off coordinates |
| hoOptimalLineDivergencePX | The current divergence (in pixels) from the optimal y-coordinate (measured roughly every 16ms or so) |
File Name: draggingtask_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 |
| draggingMechanism | "finger" vs. "stylus" (parameter) |
| draggingHand | "dominant" vs. "nondominant" vs. "left" vs. "right" (parameter) |
| canvasHeightMM | The width of the active canvas in mm |
| canvasWidthMM | The height of the active canvas in mm |
| squareHeightMM | The size of the square in mm |
| distanceWallToWallMM | The distance between left (top) and right (bottom) wall (from center of wall to center of wall) in mm |
| wallWidthMM | The length of the short side of the wall in mm |
| wallHeightMM | The length of the long side of the wall in mm |
| 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 |
| 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 in the current condition |
| draggingDirection | "horizontal" vs. "vertical" |
| conditionRepetition | Counts the number of times the current condition has run |
| trialCounter | Counts the number of trials in a block one trial: one right to left AND left to right swipe (same for vertical movement) |
| stimulusItem | Presented stimuli |
| response | The response of participant (the valid drop-off response area) |
| latency | Response latency (in ms); measured from: onset of trial until the lift-off response on the currently valid response area is registered. if the drop-off happens not in the valid response area, the wall does NOT change colors |
| rtMovementInitiation | The time in ms from beginning of trial until the square was grabbed |
| rtDragTime | The time in ms that the square was dragged until a valid drop was achieved |
| mouse.x | The horizontal mousefinger coordinate at square drop-off (in valid drop-off) |
| mouse.y | The vertical mousefinger coordinate at square drop-off (in valid drop-off) |
Ho = Horizontal Orientation |
|
| hoOptimallineYPX | The optimal y-coordinate in the Horizontal Orientation Condition (= y-coordinate of the white square at start of each trial) (= if participant does not diverge from this coordinate, they use the fastest way from A to B) this optimal line depends on where the square is dropped off. In this script it is NOT automatically the center line but is reset to the drop-off coordinates |
| hoOptimalLineDivergenceDropoffonlyPX | Calculates the absolute pixel difference btw. (HOOptimallineYPX - mouse.y) at drop-off only |
Vo = Vertical Orientation |
|
| voOptimallineXPX | The optimal x-coordinate in the Vertical Orientation Condition (= x-coordinate of the white square at start of each trial) (= if participant does not diverge from this coordinate, they use the fastest way from A to B) |
| voOptimalLineDivergenceDropoffonlyPX | Calculates the absolute pixel difference btw. (VOOptimalline_xPX - mouse.x) at drop-off only |
Additional Measures, Separately For Ho/Vo Conditions |
|
| medianHOOptimalLineDivergencePerTrialPX | The median vertical distance (in canvas pixels) of the finger from the 'optimal' y-coordinate from pick-up to drop-off |
| meanHOOptimalLineDivergencePerTrialPX | The mean vertical distance (in canvas pixels) of the finger from the 'optimal' y-coordinate from pick-up to drop-off |
| sdHOOptimalLineDivergencePerTrialPX | The mean standard deviation of the vertical distance (in canvas pixels) btw. the finger and 'optimal' y-coordinate from pick-up to drop-off 'optimal' in this sense means the y-coordinate of the square at the start of the trial. Moving the square along this y-coordinate is the shortest (thus fastest) way btw. the walls. |
The procedure can be adjusted by setting the following parameters.
| Name | Description | Default |
|---|---|---|
Design Parameters |
||
| draggingMechanism | Choose from: "finger" vs. "stylus" if "finger", the index finger is assumed | "finger" |
| draggingHand | 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 false: the script skips the demonstration (e.g. if task administrator wants to demonstrate themselves) | true |
| runHorizontalOrientation | True = run the task in the Horizontal Orientation false = do not run the task in the Horizontal Orientation | true |
| runVerticalOrientation | True = run the task in the Vertical Orientation false = do not run the task in the Vertical Orientation | true |
| numberOfBlocksPerCondition | Number of blocks per orientation condition ; Beard (2020) report 12 blocks per condition | 6 |
| trialsPerBlock | One trial = one left and right movement | 16 |
| repetitionsPerCondition | The number of repetitions for each condition in this script: conditions repeat once they have all run Example for a condition: 'horizontal orientation' | 1 |
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 |
||
| squareHeightPct | The proportional size of the square to canvas HEIGHT | 10.5% |
| distanceWallTowallPct | The proportional distance from one wall to the other wall relative to canvas HEIGHT | 86% |
| wallShortsidePct | The length of the short side of the wall relative to canvas HEIGHT | 17% |
| wallLongsidePct | The length of the long side of the wall relative to canvas HEIGHT | 93% |