___________________________________________________________________________________________________________________ Mackworth Clock Vigilance Test ___________________________________________________________________________________________________________________ Script Author: Jeffrey Q. Ouyang (qijia.ouyang@gmail.com) Date: 08-08-2011 last updated: 12-20-2024 by K. Borchert (katjab@millisecond.com) for Millisecond Software, LLC Script Copyright © 12-20-2024 Millisecond Software ___________________________________________________________________________________________________________________ BACKGROUND INFO ___________________________________________________________________________________________________________________ This script implements the Mackworth Clock Vigilance Test; a go/nogo test to measure a persons's ability to sustain attention in the face of monotonous stimulation with rare target events. The implemented procedure is heavily inspired by Lichstein et al (2000). References: Lichstein, K. L., Riedel, B. W., & Richman, S. L. (2000). The Mackworth Clock Test: A Computerized Version. The Journal of Psychology, 134(2), 153–161. https://doi.org/10.1080/00223980009600858 Mackworth, N. H. (1948). The breakdown of vigilance during prolonged visual search. Quarterly Journal of Experimental Psychology, I , 6-21. ___________________________________________________________________________________________________________________ TASK DESCRIPTION ___________________________________________________________________________________________________________________ Participants watch a red dot jump from one circle position to next position (100) in a clockwise fashion at constant speed. Occasionally, the red dot makes a larger jump. Participants are asked to press the Spacebar whenever they notice such a skip event (go event). ___________________________________________________________________________________________________________________ DURATION ___________________________________________________________________________________________________________________ the default set-up of the script takes appr. 60 minutes to complete (under the cover the script runs two rounds of 30 minutes) ___________________________________________________________________________________________________________________ DATA FILE INFORMATION ___________________________________________________________________________________________________________________ The default data stored in the data files are: (1) Raw data file: 'mackworthclock_raw*.iqdat' (a separate file for each participant) build: The specific Inquisit version used (the 'build') that was run computer.platform: the platform the script was run on (win/mac/ios/android) date, time: date and time script was run subject, group, with the current subject/groupnumber session: with the current session id blockCode, blockNum: the name and number of the current block (built-in Inquisit variable) trialCode, trialNum: the name and number of the currently recorded trial (built-in Inquisit variable) Note: trialNum is a built-in Inquisit variable; it counts all trials run; even those that do not store data to the data file such as feedback trials. Thus, trialNum may not reflect the number of main trials run per block. roundCounter: tracks the number of rounds run (default: 2 rounds) roundFlag: 0 = the theoretical skip timepoints for the current round were generated without issue 1 = the theoretical skip timepoints for the current round could not be generated; the default values in list.skipEventTime are used (Note: these values only work correctly for the default script settings!) nextSkipTime: stores the calculated next skipTime (in ms) => if the script.elapsedTime at the end of a trial exceeds this time, a skip trial is initiated flashTimeStamp: the timestamp of the current flash (timestamp = measured in ms based on script starttime) responseWindow: 1 = the response Window is active AT THE BEGINNING of the trial 0 = the response Window is inactive AT THE BEGINNING of the trial (Note: the script checks at the end of the trial whether the responseWindow was still active at time of a response) script.elapsedTime: the script elapsed time (in ms) at the end of the current trial response: the scancode of the response (57 = spacebar press; 0 = no response) latency: the response latency (in ms) of the current trial (relative to trial start) - if no response, actual trial duration skipRT: sums up trial latencies for all trials with an active responseWindow after a skip hit: 1 = hit (spacebar pressed after skipped event within allowed timeframe); 0 = no hit falseAlarm: 1 = False Alarm (spacebar pressed outside of response window after a skip event); 0 = no FA hitsPerRound: counts all hits during current round falseAlarmsPerRound: counts all false alarms during current round skipCount: counts the number of skipped events during current round meanSkipIntervalMS: the mean skip interval (in ms) based on actual skip timestamps for the current round //skipEvents Timings: debugging variables avgEventInterval: the calculated average skip interval (in ms) used to sample the skipEvents list.skipEventTime.itemCount: the number of skip events stored in list.skipEventTime (note: this should always be 1 more than the actual number of skip events) attempts: the number of times the script attempted to generated the list of skip events to fulfill all three criteria roundStartTime: the timestamp of the current round start e1: calculated timestamp of the first skip event (a skip should be run if the script.elapsedTime of the current trial exceeds this duration) e2: e3: e4: e5: e6: e7: e8: e9: e10: e11: e12: e13: pseudo skip event (scheduled to appear after the end of the round) roundEndTime: scheduled timestamp of the end of the current round (2) Summary data file: 'mackworthclock_summary*.iqdat' (a separate file for each participant) inquisit.version: Inquisit version run computer.platform: the platform the script was run on (win/mac/ios/android) 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 = script was not completed (prematurely aborted); 1 = script was completed (all conditions run) //Round 1 Data: flag1: 0 = no issues with generating the skip times in this round 1 = the skip times in this round could not be generated; the default values from list.skipEventTimes were used (IMPORTANT: work only for default settings of script) meanSkipInterval1: the mean skip interval (in ms) - based on actual flash timestamps- in round1 (skip interval = difference in timestamps of consecutive skip flashes) hitRT1: mean hit response time (ms) to skip events in round1 (Note: -999 => no skipRTs were recorded in this round) skipEvents1: number of skip events in round1 hits1: number of hits in round1 hitRate1: hitrate in round1 missRate1: missrate in round1 (missrate = 1- hitRate) NoSkipEvents1: number of no skip events in round1 fa1: number of false alarms in round1 faRate1: false alarm rate in round1 crRate1: correct rejection rate in round1 (crRate = 1-faRate) //Signal Detection Measures Note: corrections to extreme hitrate/false alarm rate based on: Gregg, A. & Sedikides, C. (2010). Narcissistic Fragility: Rethinking Its Links to Explicit and Implicit Self-esteem, Self and Identity, 9:2, 142-161 (p.148) => Adjustments are made if the FArate (hitRate) = 0 (increased to 0.005) or 1 (decreased to 0.995) zHitRate1: z-score of hit rate in round1 zFARate1: z-score of fa rate in round1 dprime1: Computes d' (parametric measure of discriminability btw. signals and noise) dprime = z(hitRate)-z(faRate) => Range (in this script): -5.1516586840152740479 <= dprime <= 5.1516586840152740479 (=perfect performance) => The higher the value, the better signals (here: skips) were overall distinguished from noise (no skips) (d' = 0: chance performance; negative d-primes: participant treated nontargets as targets and targets as nontargets) c1: criterion measure c-criterion in signal detection:The absolute value of c provides an indication of the strength of the subject bias negative when participant more likely to report that signal (here: a skip) is present ('liberal') positive for favoring caution => same for round2 _______________________________________________________________________________________________________________ EXPERIMENTAL SET-UP ___________________________________________________________________________________________________________________ Practice: the script provides an optional practice session (see editable parameters to turn it off). The practice session runs for 1 minute and presents 3 skip events at fixed times. Test Procedure: by default the script runs 2 rounds (duration of rounds can be set via editable parameters) There is no break btw rounds (round2 picks up where round1 left off). The default length of one round is 30 minutes in this script (see Mackworth, 1948 and Lichstein et al, 2000). 1. A circle, with 100 equally spaced lightgray 'slots' is presented on the computer screen. 2. A red dot starts from the 12'o clock position and flashes in turn in each "slot". 2a.The dot stays in each slot for 1s. 3. The signal event is when the dot skips 4 positions (default, can be edited via editable parameters). 3a.The subject identifies this event by hitting the space bar (or other user-definable key). 3b.Total number of signal events is user-definable (default: 12 skip events during one round, see Mackworth, 1948 and Lichstein et al, 2000) //////////////////////////////////////////////// Algorithm to generate the skip event times: //////////////////////////////////////////////// The algorithm to generate the skip events in this script, attempts to fulfill three constraints 1. the skipEvents are separated by the set responseWindow 2. the first skip event occurs around 1 minute into the round (see Lichstein et al, 2000) => based on a 30 minute round length (Lichstein et al, 2000), the general proportion of 1/30 is used to calculate the onset of the first signal in this script 3. the last skip event cannot occur during the last 10 minutes into the round (see Lichstein et al, 2000) => based on a 30 minute round length (Lichstein et al, 2000), the general proportion of 10/30 = 1/3 is used to calculate the last acceptable time for the last signal in this script All skip events timings are based on an average skip interval based on 2/3*the duration of the task and added with some random juggle time to the previous skipTime in this script. For example: the average skip interval for a 30 minute round, is calculated as ~1.5Minutes IMPORTANT: if the script cannot generate a sequence of skip events that fulfill those constraints within 500 attempts, the script uses the default sequence provided in list.skipEventTime. These emergency skiptimes were generated for the default settings of this script (30 minute round with 12 skip events etc.). If the emergency sequence is used, the data file will be 'flagged'. ___________________________________________________________________________________________________________________ INSTRUCTIONS ___________________________________________________________________________________________________________________ check under section Editable Instructions ___________________________________________________________________________________________________________________ EDITABLE CODE ___________________________________________________________________________________________________________________ check below for (relatively) easily editable parameters, stimuli, instructions etc. Keep in mind that you can use this script as a template and therefore always "mess" with the entire code to further customize your experiment. The parameters you can change are: //User-definable Macworth clock test parameters: / runPractice = true //true = the task begins with a short practice session. //the practice session lasts 1 minute and runs 2 skip events //false = no practice session is run / numberOfRounds = 2 //number of rounds run (Note: the rounds are *NOT* announced to participants) //Note: summary variables provided for max. 2 rounds only / skipStep = 4 //number of steps covered for a skip (Note: Lichstein et al. reporting using a quadruple jump instead of a single jump) //IMPORTANT: Changing the following parameters MAY change the skip event algorithm calculator //The Skip Event Algorithm tries to: //1. present the first skip event about 1/30 into the duration of the round (1/30 = around the first minute into a 30 minute testing round) //2. only present skip events during the first 2/3s of a round (e.g. no skip events during the last 10 minutes into a 30 minute testing round) //3. prevent overlap of skip events given the response window //IF the algorithm cannot generate new skip events, it will reset to the emergency values provided by the script //These emergency values were generated with the default values (see below) in mind / totalRoundRunTime = 1800000 //amount of time in ms for one round (30 minutest per round) - Lichstein et al (2000) / flashInterval = 1000 //Interval (in ms) between regular dot "flashes" - Lichstein et al (2000) / totalRoundSkipEvents = 12 //Total number of signal (skip) events per round - Lichstein et al (2000) / responseWindowMS = 8000 //the max time in ms that a participant can respond after a signal (skip) event - Lichstein et al (2000) / signalPeriod = 20/30 //the signals appear only during the first 2/3 of the round //this value is based on Lichstein et al (2000, p.155) who restricted //signals to the first 20 minutes of a 30 minute round //Note: the max signal period cannot be larger than 1 //and should probably not be restricted more than the default setting / firstSignalOnset = 1/30 //the first signal should appear around 1/30 into the round //this value is based on Lichstein et al (2000, p.155) who started //the first signal around 1 minute into a (30min) round //Note: recommended not to change; the script ensures that the first //flash cannot be a signal flash. //UI parameters: / circleProportion = 0.475 //the proportion of the circle (Note: 47.5% is the max for a dotHeightPct of 2.5%) / dotHeightPct = 2.5% //the size of the circle dots (the moving red dot is about 95% of a circle dot) *Note: If possible, skip events will be randomly distributed such that the duration before the next event is at least as long as the specified response window. This may not be possible, however, if relative large number of events are specified for a relative short task time, or if the response window is too long.