___________________________________________________________________________________________________________________ Millisecond Software One Card Learning Test (MS-OCL) ___________________________________________________________________________________________________________________ Script Author: Katja Borchert, Ph.D. (katjab@millisecond.com) for Millisecond Software, LLC Date: 04-18-2022 last updated: 04-10-2024 by K. Borchert (katjab@millisecond.com) for Millisecond Software, LLC Script Copyright © 04-10-2024 Millisecond Software ___________________________________________________________________________________________________________________ BACKGROUND INFO ___________________________________________________________________________________________________________________ This script implements Millisecond Software's version of the One Card Learning Test (OCL), a test of visual memory using a pattern separation paradigm. Millisecond Software's implementation is based on the description of the test published by White et al (2021). The Millisecond Software implementation can be set to run the OCL-80 or the shortened OCL-48 design (White et al, 2021). The MS-OCL is designed to be run on touchscreens but adapts to mouse use on non-touch screens. Researchers can select to run the task with an absolute screen size to ensure that distances stay the same across devices. The default settings are optimized for ipad touchscreens. See section Editable Parameters for more info. ///Reference:/// White, J.P., Schembri, A., Edgar,C.J., Lim, Y.Y., Masters, C.L., & Maruff, P. (2021). A Paradox in Digital Memory Assessment: Increased Sensitivity With Reduced Difficulty. Frontiers in Digital Health, 3, 1-12. https://www.frontiersin.org/article/10.3389/fdgth.2021.780303 ___________________________________________________________________________________________________________________ TASK DESCRIPTION ___________________________________________________________________________________________________________________ Participants get presented with a deck of cards (consisting of the regular 4 suits - 13 cards per suit) and the cards will be turned over one by one. Some of the cards will appear only once but some may appear more often. Participants are asked to decide for each card whether they have seen the card before or not. If they think they have seen the card before, they should press the 'Yes' response button. If they think the card is new, they should press the 'No' response button. If the incorrect response button is pressed it is highlighted in red and the card stays on screen until the correct response button is pressed. Participants are instructed to respond as quickly and accurately as they can. Once the correct response button is pressed, the button is highlighted in green and an animation is started that 'returns' the card back to the stack. The next trial is initiated once participants press a 'Home Button'. The 'Home Button' is implemented to ensure that response fingers are roughly equally distanced from both the no and yes button. Researchers can select whether to run the task with an absolute screen size to ensure that home button-response button distances stay the same across devices. The default settings are optimized for an ipad touchscreen. ___________________________________________________________________________________________________________________ DURATION ___________________________________________________________________________________________________________________ the default set-up of the script takes approx. OCL-80: ~10 minutes OCL-48: ~7 minutes ___________________________________________________________________________________________________________________ DATA OUTPUT DICTIONARY ___________________________________________________________________________________________________________________ The fields in the data files are: (1) Raw data file: 'ms_onecardlearningtest_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: with the current subject id group: with the current group id session: with the current session id //Play Setup: (parameter) runAbsoluteSizes: true (1) = should run absolutely sized canvas (see parameters- canvasHeightMM) false (0) = should use proportionally sized canvas (uses width = 43*screenHeight) canvasAdjustments: NA: not applicable => parameters- runAbsoluteSize was set to 'false' 0: parameters- runAbsoluteSize was set to 'true' and screen size was large enough 1: parameters- runAbsoluteSize was set to 'true' BUT screen size was too small and adjustments had to be made playAreaHeightMM: the width of the play area in mm playAreaWidthMM: the height of the play area in mm display.canvasHeight: the height of the active canvas ('playarea') in pixels display.canvasWidth: the width of the active canvas ('playarea') in pixels pxPerMM: the conversion factor to convert pixel data into mm-results for the current monitor (Note: 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 or the other way around distanceHomeButtonResponseButtonMM: the calculated distance (in mm) between center of homeButton and center of one of the response buttons (parameter) OCL_Version: the OCL version (OCL-80 or OCL-48) run by the script //across test block// numberTargetTrials: the number of trials to present targets numberLureTrials: the number of trials to present lures numberFoilTrials: the number of trials to present foils numberDistractors: the number of distractor trials (lures + foils) //per round: (each round presents the four targets - order random) numberTargetsPerRound: the number of target trials per round numberDistractorsPerRound: the number of distractor trials per round numberRounds: the number of rounds per test block 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. target1: stores the filename of target1 (club target) target2: stores the filename of target2 (diamond target) target3: stores the filename of target3 (hearts target) target4: stores the filename of target4 (spade target) iti: the randomly selected intertrial interval (in ms) of the current trial Note: iti is added after participant presses the home button to start next trial roundCounter: the round counter trialCounter: the trial counter across the entire test (does not reset per round) countTargets: counts the number of targets run so far countLures: counts the number of lures run so far countFoils: counts the number of foils run so far trialType: 1 = target trial 2 = lure trial 3 = foil trial (trial type is selected randomly with constraint that active lure stimuli can be selected) cardType: "new target" (for round1), "target", "lure", "foil" cardItemNumber: the itemnumber of the currently presented card card: the filename of the currently presented card corrRsp: the correct response for the current card ("yes" or "no") Note: targets in round1 ('new target') have the correct response of 'no'. Starting with round2 the correct response for targets is 'yes'. For any other card, the correct response is always 'no' firstResponse: the first response button pressed in a trial (determines accuracy) //Built-in DVs response: the response of participant (button pressed) By design, this script will store the FINAL (corrected) response correct: correctness of response (1 = correct, 0 = error) By design, 'correct' refers to the FIRST response made (see values.firstResponse) latency: response latency (in ms); measured from: onset of card (NOT from last response) until FINAL (corrected) response (2) Summary data file: 'ms_onecardlearningtest_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) //Play Setup: (parameter) runAbsoluteSizes: true (1) = should run absolutely sized canvas (see parameters- canvasHeightMM) false (0) = should use proportionally sized canvas (uses width = 43*screenHeight) canvasAdjustments: NA: not applicable => parameters- runAbsoluteSize was set to 'false' 0: parameters- runAbsoluteSize was set to 'true' and screen size was large enough 1: parameters- runAbsoluteSize was set to 'true' BUT screen size was too small and adjustments had to be made playAreaHeightMM: the width of the play area in mm playAreaWidthMM: the height of the play area in mm display.canvasHeight: the height of the active canvas ('playarea') in pixels display.canvasWidth: the width of the active canvas ('playarea') in pixels pxPerMM: the conversion factor to convert pixel data into mm-results for the current monitor (Note: 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 or the other way around distanceHomeButtonResponseButtonMM: the calculated distance (in mm) between center of homeButton and center of one of the response buttons (parameter) OCL_Version: the OCL version (OCL-80 or OCL-48) run by the script //across test block// numberTargetTrials: the number of trials to present targets numberLureTrials: the number of trials to present lures numberFoilTrials: the number of trials to present foils numberDistractors: the number of distractor trials (lures + foils) //targets: target1: stores the filename of target1 (club target) target2: stores the filename of target2 (diamond target) target3: stores the filename of target3 (hearts target) target4: stores the filename of target4 (spade target) //Measures: propCorrect: proportion correct responses across all test trials meanRT: mean correct response time (in ms) across all test trials propCorrectAllTargets: proportion correct responses across all trials that present the target cards Note: for the first four target presentations, the response is 'no'. For the remaining presentations, the correct response is 'yes' propCorrectActiveTargets: proportion correct responses across all trials that present active targets (active = previously seen at least once; starting from round2) propCorrectLures: proportion correct responses across all lure trials propCorrectFoils: proportion correct responses across all foil trials ___________________________________________________________________________________________________________________ EXPERIMENTAL SET-UP ___________________________________________________________________________________________________________________ The Millisecond Implemention of the OCL goes as follows: ///////////////////////////////////////////////////////////////////////////////////// 1. Target/Lure/Foil Assignment: (see White et al, 2021, p.4) ///////////////////////////////////////////////////////////////////////////////////// //Targets// The script randomly picks one card from each of the four suits (clubs, diamonds, hearts, spades) with the following constraint: - each of the four targets must have a different value //Lures// For each of the four targets, the script stores the same numerical value card of the remaining three suits as lures. Example: Target = ace of clubs => Lures: ace of diamonds, ace of hearts, ace of spades //Foils// The remaining cards from the deck are assigned to be Foils. ///////////////////////////////////////////////////////////////////////////////////// 2. Intro: ///////////////////////////////////////////////////////////////////////////////////// a self-paced short introduction block that can be repeated as often as needed The demo card used for the instructions is not used for the actual game ///////////////////////////////////////////////////////////////////////////////////// 3. Test Block: ///////////////////////////////////////////////////////////////////////////////////// OCL-80: 80 trials (32 Target trials, 12 Lure trials, 36 Foil trials; ratio target:distractor = 2:3) OCL-48: 48 trials (24 Target trials, 6 Lure trials, 18 Foil trials; ratio target:distractor = 1:1) The test block is divided internally into different rounds (each round presents the four targets once) OCL-80: 8 Rounds => 10 trials per round: 4 Targets*, 6 distractors (either Foils or Lure** trials); order of trials within round randomly decided OCL-48: 6 Rounds => 8 trials per round: 4 Targets*, 4 distractors (either Foils or Lure** trials); order of trials within round randomly decided Notes: - *Targets: targets get introduced during the first round at which point they are indistinguishable from foils (correct response is NO) => target repeats start with round2 (correct response for targets switches to YES) -**Lures: the script only presents Lures if the corresponding Target has already been presented at least once, thus valid Lures CAN be presented during round1. For OCL-48, the selection of the 6 lures is randomly determined from the pool of 12. Trial Sequence: - iti-trial: participant is required to press the home button. Pressing the home button starts the random intertrial interval (500-1500ms) If the home button is not pressed within 2s, a reminder to press the home button is presented on screen - card-trial: a new card is revealed; script waits until correct response is made if incorrect response is made the card keeps sitting in the middle until correct response is made Also: The correctly pressed button is 'rewarded' with a green frame; the incorrectly pressed button is marked by a red frame. - card-feedback: 1000ms -> card is 'turned over and returned to deck' (if the home button is pressed during the animation feedback, the random intertrial interval is started immediately after the animation) ___________________________________________________________________________________________________________________ STIMULI ___________________________________________________________________________________________________________________ provided by Millisecond Software - can be edited under section 'Editable Stimuli' ___________________________________________________________________________________________________________________ INSTRUCTIONS ___________________________________________________________________________________________________________________ provided by Millisecond Software - can be edited under section 'Editable Instructions' The entire instructions are run by block.intro You can can replace the instructions by creating your own block.intro or edit the existing one. ___________________________________________________________________________________________________________________ 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: