Script Author: Katja Borchert, Ph.D. (katjab@millisecond.com), Millisecond
Created: August 31, 2017
Last Modified: June 09, 2026 by K. Borchert (katjab@millisecond.com), Millisecond
Script Copyright © Millisecond Software, LLC
This script implements a computerized version of the Nine Hole Peg Test, a test of fine motor behavior.
Mathiowetz V, Weber K, Kashman N, Volland G. Adult Norms for the Nine Hole Peg Test of Finger Dexterity. The Occupational Therapy Journal of Research. 1985;5:24-33.
Earhart, G.M., Cavanaugh, J.T., Ellis, T., Ford, M.P., Foreman, K.B., & Dibble, L. (2011). The 9-Hole Peg Test of Upper Extremity Function: Average Values, Test-Retest Reliability, and Factors Contributing to Performance in People With Parkinson Disease. JNPT, 35, 157-163.
Tobler-Ammann, B.C.,de Bruin, E.D., Fluet, M.C., Lambercy, O., Rob A. de Bie, R.A. & Knols, R.H. (2016). Concurrent validity and test-retest reliability of the Virtual Peg Insertion Test to quantify upper limb function in patients with chronic stroke. Journal of NeuroEngineering and Rehabilitation, 13:8.
7 minutes
Phase1: Participants are asked to move 9 'pegs' (=blue discs) with the mouse from one area of the screen into the 9 empty holes (=white discs) of a pegboard. Phase2: Once all pegs are placed, participants need to move them back to the starting positions.
The stimuli are created by the script. The size of the holes (on pegboard) can be edited via an editable parameter
provided by Millisecond - can be edited in script nineholepegtest_instructions_inc.iqjs
File Name: nineholepegtest_summary*.iqdat
| Name | Description |
|---|---|
| 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 |
| 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 |
| completed | 0 = Test was not completed 1 = Test was completed |
| movingDuration1DH | Phase1 (DOMINANT hand): stores the complete duration (in ms) of moving the pegs to the pegboard until all holes are filled measured from selecting the first peg |
| timeUntilFirstPegSelection1DH | Phase1 (DOMINANT hand): stores the time (in ms) it took participant to start moving the first peg to the pegboard |
| transportDrops1DH | Phase1 (DOMINANT hand): number of transport drops across pegs (transfer drop: picking up and dropping a peg before it is successfully placed) |
| movingDuration2DH | Phase2 (DOMINANT hand): stores the complete duration (in ms) of moving the pegs back to the startline until all pegs are back measured from selecting the first peg from the pegboard |
| timeUntilFirstPegSelection2DH | Phase2 (DOMINANT hand): stores the time (in ms) it took participant to start moving the first peg back to the startline |
| transportDrops2DH | Phase2 (DOMINANT hand): number of transport drops across pegs (transfer drop: picking up and dropping a peg before it is successfully placed) |
| movingDuration1NDH | Phase1 (NON-DOMINANT hand): stores the complete duration (in ms) of moving the pegs to the pegboard until all holes are filled measured from selecting the first peg |
| timeUntilFirstPegSelection1NDH | Phase1 (NON-DOMINANT hand): stores the time (in ms) it took participant to start moving the first peg to the pegboard |
| transportDrops1NDH | Phase1 (NON-DOMINANT hand): number of transport drops across pegs (transfer drop: picking up and dropping a peg before it is successfully placed) |
| movingDuration2ndH | Phase2 (NON-DOMINANT hand): stores the complete duration (in ms) of moving the pegs back to the startline until all pegs are back measured from selecting the first peg from the pegboard |
| timeUntilFirstPegSelection2ndH | Phase2 (NON-DOMINANT hand): stores the time (in ms) it took participant to start moving the first peg back to the startline |
| transportDrops2ndH | Phase2 (NON-DOMINANT hand): number of transport drops across pegs (transfer drop: picking up and dropping a peg before it is successfully placed) |
File Name: nineholepegtest_raw*.iqdat
| Name | Description |
|---|---|
| date | Date the session was run |
| time | Time the session was run |
| subject | Participant ID |
| group | Group number |
| session | Session number |
| 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 |
| 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. |
| condition | "DragDropTraining" (drag/drop training), "practice2" (dry run of task), "test" |
| phase | 1 = move pegs to board; 2 = move pegs from board back to start |
| hand | DH = dominant hand; NDH = non-dominant hand |
| targetPeg | Stores the currently moved peg |
| latency | The response latency (in ms); measured from: onset of trial until measured response |
| countSuccesses | Stores the number of pegs successfully placed |
| transportDrops | The sum of all 'transport Drops' during the current phase (resets for each phase and hand) transportdrop = number of time participants released ('dropped') a stimulus prematurely before it's successfully placed transportDropsPeg1- |
| transportDropsPeg9 | Calculates the number of times peg1-9 was picked up and released ('dropped') before it was successfully placed into a hole |
| movingDuration | Calculates the complete duration (in ms) of moving the pegs until all holes are filled (phase 1) or pegs are moved back beyond startwall (phase 2); measured from selecting the first peg until last peg is placed |
| startMoveTime | Stores the script.elapsedTime (in ms) of the start of a movement trial (either phase 1 or phase 2) |
| startMoveFirstPeg | Stores the script.elpasedtime (in ms) of moving the first peg measured from clicking on the first peg (either phase 1 or phase 2) |
| timeUntilFirstPegSelection | Stores the time (in ms) it took participant to start moving the first peg to the pegboard (phase 1) or from the pegboard back beyond the startwall (phase 2) |
| endTime | Stores the script.elapsedTime (in ms) at the end of successfully moving all 9 pegs into the holes (phase 1) or pegs are moved back beyond startwall (phase 2) |
| peg1Set-pegSet9 | 1 = peg1 is successfully placed; 0 = otherwise |
| hole1Occupied-hole9Occupied | 1 = hole1 (from left to right, top to bottom) is occupied by a peg; 0 = otherwise |
The procedure can be adjusted by setting the following parameters.
| Name | Description | Default |
|---|---|---|
| sizingFactor | Sets the size of the holes on the backboard in relation to the size of the pegs. Default: 1.25 => the radius of the holes are 1.25 times the radius of the pegs (10% larger) the script enforces a range of 1.025 - 1.5. | 1.25 |