diff --git a/DeToX/Base.py b/DeToX/Base.py index 88f29f7..abefc60 100644 --- a/DeToX/Base.py +++ b/DeToX/Base.py @@ -471,9 +471,9 @@ def calibrate(self, - 9: Comprehensive 9-point pattern (3×3 grid). - list: Custom points in normalized coordinates [-1, 1]. Example: [(-0.4, 0.4), (0.4, 0.4), (0.0, 0.0)] - infant_stims : list of str or None, optional + infant_stims : list of str or True, optional Paths to engaging image files for calibration targets (e.g., colorful - characters, animated objects). If None (default), uses built-in stimuli + characters, animated objects). If True (default), uses built-in stimuli from the package. If fewer stimuli than calibration points are provided, stimuli are automatically repeated in sequence to cover all points (e.g., 3 stimuli for 7 points becomes [s1, s2, s3, s1, s2, s3, s1]). @@ -569,7 +569,7 @@ def calibrate(self, num_points = len(norm_points) # --- Stimuli Loading --- - if infant_stims is None: + if infant_stims is True: # Load default stimuli from package import glob diff --git a/DeToX/Calibration.py b/DeToX/Calibration.py index 6404255..30ca762 100644 --- a/DeToX/Calibration.py +++ b/DeToX/Calibration.py @@ -805,7 +805,7 @@ def __init__( # --- Tobii-Specific Setup --- self.calibration = calibration_api - + self.verbose = verbose def run(self, calibration_points): """ @@ -1078,7 +1078,7 @@ def __init__( # --- Mouse-Specific Setup --- self.mouse = mouse self.calibration_data = {} # point_idx -> list of (target_pos, sample_pos, timestamp) - + self.verbose = verbose def run(self, calibration_points): """ diff --git a/Documentation/Vignettes/Calibration.qmd b/Documentation/Vignettes/Calibration.qmd new file mode 100644 index 0000000..5745c3c --- /dev/null +++ b/Documentation/Vignettes/Calibration.qmd @@ -0,0 +1,264 @@ +--- +title: "Calibration" +description-meta:: "Learn how to use DeToX to perform calibration to ensure the best data quality" +author: Tommaso Ghilardi +keywords: [DeToX, Eye Tracking, Calibration, Setup, Tobii, PsychoPy, Infatn calibration, infant friendly, eye tracker setup, python] +execute: + enabled: false +--- + +Good eye tracking data starts long before you present your first stimulus—it begins with proper setup and calibration. Even the most carefully designed experiment will produce noisy, unusable data if the eye tracker isn't configured correctly. This is particularly critical when testing infants and children, where data quality can be challenging even under ideal conditions. In this tutorial, we'll walk through how to use DeToX to ensure the best possible data quality from the start. + +We'll focus on two essential steps: + +1. positioning your participant in the eye tracker's optimal tracking zone + +2. running the calibration procedure + +Get these right, and everything else falls into place. + +## Part 1: Positioning Your Participant + +### Understanding the Track Box + +Every eye tracker has a track box—an invisible 3D zone where it can accurately detect eyes. Step outside this zone, and tracking quality drops fast! While we try to seat everyone consistently, even small differences in posture or chair height can matter. The good news? DeToX makes checking position as easy as calling a single method. + +::: callout-warning +This tutorial assumes you've completed [Getting started](GettingStarted.qmd). If not, start there first!!! +::: + +### Setup Code + +Let's begin with our standard setup: + +```{python} +#| label: Libraries +#| eval: false +from psychopy import visual, core +from DeToX import ETracker + + +## Creat the window +win = visual.Window( + size=[1920, 1080], # Window dimensions in pixels + fullscr=True, # Expand to fill the entire screen + units='pix' # Use pixels as the measurement unit +) + + +## Connect to the eyetracker +ET_controller = ETracker(win) +``` + +We're following the same steps from the previous tutorial. First, we import the libraries we need—`psychopy.visual` for creating our display window and `DeToX.ETracker` for controlling the eye tracker. + +Next, we create a PsychoPy window where all our stimuli will appear. + +Finally, we connect to the Tobii eye tracker by creating an `ETracker` object. This automatically searches for connected devices, establishes communication, and links the tracker to our window. You'll see connection info printed to confirm everything's working. Now the `ET_controller` object is ready to control all eye-tracking operations! + +### Checking Position in Real-Time + +Now for the magic—visualizing where your participant's eyes are in the track box: + +```{python} +Et_controller.show_status() +``` + +### What You'll See + +When you call `show_status()`, an animated video of animals appears to keep infants engaged. Overlaid on the video are two colored circles—🔵 **light blue** and 🔴 **pink** —showing where the tracker detects your participant's eyes in real-time. A black rectangle marks the track box boundaries where tracking works best. + +Below the rectangle, a green bar with a moving black line indicates distance from the screen. The line should be centered on the bar (about 65 cm distance). + +![](/resources/Vids\ShowStatus.gif){fig-align="center" width="960"} + +::: callout-important +### Simulation Mode + +If you're running with `simulate=True`, the positioning interface uses your mouse instead of real eye tracker data. Move the mouse around to see the eye circles follow, and use the **scroll wheel** to simulate moving closer to or further from the screen. +::: + +Center both colored circles within the black rectangle. If they're drifting toward the edges, ask the participant to lean in the needed direction, or adjust the eye tracker mount if possible. + +For distance, watch the black line on the green bar. Too far left means too close (move back), too far right means too far (move forward). Aim for the center. + +Press **SPACE** when positioning looks good—you're ready for calibration! + +::: Advanced +### Customizing the Positioning Display + +By default, `show_status()` displays an animated video of animals to keep infants engaged while you adjust their position. However, you can customize this behavior using the `video_help` parameter: + +**`video_help=True`**: Uses the built-in instructional video included with DeToX (default). This is the easiest option and works well for most studies. + +**`video_help=False`**: Disables the video entirely, showing only the eye position circles and track box. Useful if you prefer a minimal display or if video playback causes performance issues. + +**`video_help=visual.MovieStim(...)`**: Uses your own custom video. You'll need to pre-load and configure the MovieStim object yourself, including setting the appropriate size and position for your display layout. +::: + +## Part 2: Calibration + +With your participant positioned correctly, you're ready for calibration. But what exactly is calibration, and why do we need it? + +### Understanding Calibration + +Calibration teaches the eye tracker how to interpret each participant's unique eye characteristics. Everyone's eyes are slightly different—different sizes, shapes, reflection patterns—so the tracker needs a personalized model to accurately estimate where someone is looking. + +The process is straightforward: you present targets at known locations on the screen, the participant looks at each one, and the tracker records the relationship between eye features and screen coordinates. This creates a custom mapping for that individual. + +![Image from [tobii website](https://help.tobii.com/hc/en-us/articles/360023794433-How-does-the-calibration-work)](https://help.tobii.com/hc/article_attachments/360036648293/How_DoesEyetrackingWork_ScreenBased.jpg){fig-align="center" width="712"} + +Sounds complex, right? It is—but DeToX handles the complexity for you. Here's how simple it becomes: + +### Launching Calibration with DeToX + +```{python} +ET_controller.calibrate( + calibration_points = 5, + shuffle=True, + audio=True, + anim_type='zoom', + visualization_style='circles' +) +``` + +Let's break down what's happening here: + +**`calibration_points=5`**: Uses a standard 5-point calibration pattern (corners plus center). This is the default and works well for most studies. You can also choose 9 points for higher precision, or pass a custom list of coordinates in height units for specialized configurations. + +**`shuffle=True`**: Randomizes which image appears at each calibration point. This prevents habituation and keeps participants engaged throughout the procedure. + +**`audio=True`**: Plays an attention-getting sound along with the visual stimulus to help capture and maintain the participant's focus. **`anim_type='zoom'`**: Makes the stimuli gently pulse in size to attract attention. You can also use `'trill'` for a rotating animation. + +**`visualization_style='circles'`**: Displays the calibration results using dots at each point. You can also choose `'lines'` to show lines connecting the target to where the gaze landed. + +::: Advanced +### Customizing Calibration Parameters + +Beyond the basic configuration, you can customize several aspects of the calibration procedure to match your experimental needs: + +**`infant_stims`**: By default (`infant_stims=True`), DeToX uses a set of engaging animal cartoons included with the package. These work well for most infant studies, but you can provide a list of file paths to your own images if you prefer custom stimuli that better match your study's theme or participant age group. + +**`audio`**: By default (`audio=True`), an attention-getting sound included with DeToX plays automatically when stimuli appear. Set this to `None` to disable audio entirely, or pass your own pre-loaded `psychopy.sound.Sound` object to use custom sounds that fit your experimental context. + +**`calibration_points`**: By default uses a 5-point pattern (corners plus center). You can specify `9` for higher precision, or pass a custom list of coordinates in height units for specialized configurations tailored to your stimulus regions. +::: + +### The Calibration Process + +#### Step 1: Instructions + +First, you'll see instructions explaining the controls: + +``` markdown +┌──────────────────── Calibration Setup ─────────────────────┐ +│Mouse-Based Calibration Setup: │ +│ │ +│ - Press number keys (1-5) to select calibration points │ +│ - Move your mouse to the animated stimulus │ +│ - Press SPACE to collect samples at the selected point │ +│ - Press ENTER to finish collecting and see results │ +│ - Press ESCAPE to exit calibration │ +│ │ +│ Any key will start calibration immediately! │ +└────────────────────────────────────────────────────────────┘ +``` + +these instructions will tell you how to control the calibration using your keyboard. + +Press any key when you're ready to begin. + +#### Data Collection + +The calibration screen appears with a thin red border indicating you're in calibration mode. Press a number key (1-5) to display an animated stimulus at the corresponding calibration point. The participant should look at the stimulus while it animates. When you're confident they're fixating on the target, press **SPACE** to collect gaze samples. The system waits briefly (0.25 seconds) to ensure stable fixation, then records the eye tracking data for that point. Repeat this process for all calibration points. You don't need to go in order. + +#### Step 3: Review Results + +Once you've collected data for all points (or whenever you're satisfied), press **ENTER** to compute and visualize the calibration results. You'll see a display showing the calibration targets and dots (or lines if you selected them in the `visualization_style`) to where the gaze samples actually landed. + +At this stage, you have several options: + +``` markdown +┌────────────── Calibration Results ───────────────┐ +│Review calibration results above. │ +│ │ +│ - Press ENTER to accept calibration │ +│ - Press Numbers → SPACE to retry some points │ +│ - Press ESCAPE to restart calibration │ +│ │ +└──────────────────────────────────────────────────┘ +``` + +**Accept the calibration**: If the results look good across all points, press **SPACE** to accept and move forward with your experiment. + +**Retry specific points**: Notice one or two points with poor accuracy? Press the number keys corresponding to those points—they'll highlight in yellow to confirm your selection. You can select multiple points if needed. Once you've marked all points for retry, press **SPACE** again to recollect data for just those points. This targeted approach is especially valuable with infants and children, where you might get excellent data at most points but struggle with one or two locations. + +**Start over**: If the overall quality is poor or you want a fresh start, press **ESCAPE** to discard all data and restart the entire calibration procedure from the beginning. + +::: callout-important +### Simulation Mode + +When running with `simulate=True`, the calibration procedure uses mouse position instead of real eye tracker data. Press number keys to display stimuli at calibration points, move your mouse to each target location, and press SPACE to "collect" samples. This allows you to test your entire experiment workflow without needing physical eye tracking hardware. +::: + +### Calibration Complete! + +Congratulations! You've successfully positioned your participant and completed the calibration procedure using DeToX. With accurate calibration in place, you're now ready to present your experimental stimuli and collect high-quality eye tracking data. + +Here's a video demonstrating the entire calibration workflow from start to finish: + +```{=html} +
+``` + +## Save and Load calibration + +While we recommend performing calibration at the start of each session to ensure optimal accuracy, DeToX also allows you to save and load calibration data for convenience. In our opinion, this should only be used in special circumstances where there is a headrest and little to no chance of movement between sessions. However, if you need to save and reuse calibration data, here's how: + +### Saving Calibration + +After completing a successful calibration, you can save the calibration data to a file: + +``` python +# Save with custom filename +ET_controller.save_calibration(filename="S01_calibration.dat") +``` + +``` markdown +┌────── Calibration Saved ─────┐ +│Calibration data saved to: │ +│S01_calibration.dat │ +└──────────────────────────────┘ +``` + +The calibration data is saved as a binary file (`.dat` format) that can be reloaded in future sessions. If you don't specify a filename, DeToX automatically generates a timestamped name like `2024-01-15_14-30-00_calibration.dat`. + +you can also choose to use a GUI file dialog to select the save location: + +``` python +# Save with GUI file dialog +ET.save_calibration(use_gui=True) +``` + +### Loading Calibration + +To reuse a previously saved calibration in a new session: + +``` python +# Load from specific file +ET.load_calibration(filename="S01_calibration.dat") +``` + +``` markdown +┌───── Calibration Loaded ──────┐ +│Calibration data loaded from: │ +│S01_calibration.dat │ +└───────────────────────────────┘ +``` + +or again, use a GUI file dialog to select the file: + +``` python +# Load with GUI file dialog +ET.load_calibration(use_gui=True) +``` \ No newline at end of file diff --git a/Documentation/Vignettes/Installation.qmd b/Documentation/Vignettes/Installation.qmd index b32a8d2..721bf2d 100644 --- a/Documentation/Vignettes/Installation.qmd +++ b/Documentation/Vignettes/Installation.qmd @@ -1,5 +1,7 @@ --- title: "Installation" +description-meta: learn how to install DeToX. DetoX is a lightweight wrapper around PsychoPy and tobii_research, so you'll need to install PsychoPy first. This guide walks you through the installation process step-by-step. +keywords: [DeToX, PsychoPy, tobii_research, installation, eye-tracking, Tobii, Python, miniconda, virtual environment] author: Tommaso Ghilardi --- @@ -7,6 +9,14 @@ So you're interested in using DeToX? Awesome! Let's get you set up quickly. DeToX is designed as a lightweight wrapper around **PsychoPy** and **tobii_research**. Here's the good news: `tobii_research` usually comes bundled with PsychoPy, which means the only real hurdle is installing PsychoPy itself. And yes, PsychoPy *can* be a bit tricky to install due to its many dependencies—but don't worry, we'll walk you through it. Once PsychoPy is up and running, adding DeToX is a breeze. +::: callout-note +## Eye Tracker Drivers Required ![](https://connect.tobii.com/file-asset/eye_tracker_manager?v=2){fig-align="right" width="49" height="33"} + +Before DeToX can communicate with your Tobii eye tracker, you need to ensure the correct drivers are installed on your computer. The easiest way to do this is by downloading and installing the [Tobii Pro Eye Tracker Manager](https://www.tobii.com/products/software/applications-and-developer-kits/tobii-pro-eye-tracker-manager)—a free software provided by Tobii that allows you to installs the necessary drivers for your device. + +As a bonus, the Eye Tracker Manager also includes a built-in calibration tool (designed for adult self-paced calibration), which can be useful for testing that your hardware is working properly before running DeToX. +::: + ## Installing PsychoPy Since PsychoPy is the main challenge, let's tackle that first. You have **two main options**: @@ -28,12 +38,12 @@ This method is ideal if you prefer working in an IDE (like Positron, VS Code, Py #### Step 1: Create a Virtual Environment -We like to use miniforge to handle our environments and Python installations. Any other method would work as well, but for simplicity we'll show you how we prefer to do it. +We like to use miniconda to handle our environments and Python installations. Any other method would work as well, but for simplicity we'll show you how we prefer to do it. *We recommend using Python 3.10 for the best compatibility:* ``` bash -mamba create -n detox_env python=3.10 +conda create -n detox_env python=3.10 ``` This will create an environment called detox_env with python 3.10. Exactly what we need! @@ -45,7 +55,7 @@ You will probably need to confirm by pressing `y`, and after a few seconds you'l Now let's activate this environment (making sure we're using it) and then install PsychoPy: ``` bash -mamba activate detox_env +conda activate detox_env pip install psychopy ``` @@ -72,29 +82,19 @@ You are done!!! Great! Once PsychoPy is installed, we can look at DeToX. Let's gets our hand dirty! The installation is the same for both the Package and Standalone PsychoPy installations but some steps differ. -::: callout-warning -## DeToX is Still in Development - -DeToX isn't yet available on PyPI, so you'll need to install it directly from our **GitHub repository**. Don't worry—it's straightforward, and we'll guide you through it! - -**One requirement:** You need **Git** installed on your system. - -📥 **Don't have Git?** Download it from [git-scm.com](https://git-scm.com/)—installation takes just a minute. -::: - ::: panel-tabset ### Package Again make sure to be in the correct environment if you installed PsychoPy as a package. with the following command: ``` bash -mamba activate detox_env +conda activate detox_env ``` Then simply run: ``` bash -pip install git+https://github.com/DevStart-Hub/DeToX.git +pip install dvst-detox ``` Wait a few seconds, confirm if needed, and you are done! @@ -113,11 +113,21 @@ Wait a few seconds, confirm if needed, and you are done! 6. **Click the "Open PIP terminal" button** -7. **Type the following command:** `pip install git+https://github.com/DevStart-Hub/DeToX.git` +7. **Type the following command:** `pip install devst-detox` That's it! You now have both PsychoPy and DeToX installed and ready to use. ::: +::: callout-tip +## Install from git + +If you want to install the latest development version of DeToX directly from the GitHub repository, you can do so by replacing the installation command with the following: + +``` bash +pip install git+https://github.com/DevStart-Hub/DeToX.git +``` +::: + ::: callout-warning ## Important: DeToX requires coding diff --git a/Documentation/_extensions/coatless-quarto/custom-callout/_extension.yml b/Documentation/_extensions/coatless-quarto/custom-callout/_extension.yml new file mode 100644 index 0000000..030b88a --- /dev/null +++ b/Documentation/_extensions/coatless-quarto/custom-callout/_extension.yml @@ -0,0 +1,9 @@ +title: custom-callout +author: James Joseph Balamuta +version: 0.0.0-dev.1 +quarto-required: ">=1.5.0" +contributes: + filters: + - customcallout.lua + - fa.lua +source: coatless-quarto/custom-callout@0.0.1 \ No newline at end of file diff --git a/Documentation/_extensions/coatless-quarto/custom-callout/customcallout.lua b/Documentation/_extensions/coatless-quarto/custom-callout/customcallout.lua new file mode 100644 index 0000000..b22d174 --- /dev/null +++ b/Documentation/_extensions/coatless-quarto/custom-callout/customcallout.lua @@ -0,0 +1,148 @@ +-- customcallout.lua +local customCallouts = {} + +local fa = require("fa") + +-- Function to convert color to rgba +local function colorToRgba(color, alpha) + if color:sub(1,1) == "#" then + local r = tonumber(color:sub(2,3), 16) + local g = tonumber(color:sub(4,5), 16) + local b = tonumber(color:sub(6,7), 16) + return string.format("rgba(%d, %d, %d, %.2f)", r, g, b, alpha) + else + -- For named colors, we use the functional notation of rgba() + return string.format("rgb(from %s r g b / %.0f%%)", color, alpha * 100) + end +end + +-- Function to check if a string starts with "fa-" +local function isFontAwesomeIcon(icon) + return icon ~= nil and icon:sub(1, 3) == "fa-" +end + +-- Generate CSS for custom callouts +local function generateCustomCSS() + local css = "" + + -- Translate YAML callout information for custom callouts + for type, callout in pairs(customCallouts) do + if callout.color then + local color = pandoc.utils.stringify(callout.color) + + -- Base color + css = css .. string.format("div.callout-%s.callout {\n", type) + css = css .. string.format(" border-left-color: %s;\n", color) + css = css .. "}\n" + + -- Header background + css = css .. string.format("div.callout-%s.callout-style-default > .callout-header {\n", type) + css = css .. string.format(" background-color: %s;\n", colorToRgba(color, 0.13)) + css = css .. "}\n" + + -- Collapse Icon + css = css .. string.format("div.callout-%s .callout-toggle::before {", type) + css = css .. " background-image: url('data:image/svg+xml,');" + css = css .. "}\n" + + -- Icon Styling + css = css .. string.format("div.callout-%s.callout-style-default .callout-icon::before, div.callout-%s.callout-titled .callout-icon::before {\n", type, type) + + if callout.icon_symbol then + local icon_symbol_str = pandoc.utils.stringify(callout.icon_symbol) + if isFontAwesomeIcon(icon_symbol_str) then + quarto.log.output("icon_symbol_str is a Font Awesome icon") + -- Font Awesome icon + css = css .. string.format(" font-family: 'Font Awesome 6 Free';\n") + css = css .. string.format(" content: '%s';\n", fa.fa_unicode(icon_symbol_str)) + else + -- Custom icon symbol + css = css .. string.format(" content: '%s';\n", icon_symbol_str) + end + css = css .. " background-image: none;\n" + else + css = css .. string.format(" background-image: url('data:image/svg+xml,');\n", escapedColor) + end + + css = css .. "}\n" + + end + end + return css +end + + +-- Parse YAML and extract custom callout definitions +local function parseCustomCallouts(meta) + if not meta['custom-callout'] then return end + + for k, v in pairs(meta['custom-callout']) do + if type(v) == "table" then + customCallouts[k] = { + type = k, + title = v.title or k:gsub("^%l", string.upper), + icon = v.icon == 'true' or nil, + appearance = v.appearance or nil, + collapse = v.collapse or nil, + icon_symbol = v['icon-symbol'] or nil, + color = v.color or nil, + background_color = v['background-color'] or nil + } + end + end + + + -- Generate and add custom CSS to the document + local customCSS = generateCustomCSS() + if customCSS ~= "" then + quarto.doc.include_text('in-header', '') + end + +end + + +-- Convert div to custom callout if it matches a defined custom callout +local function convertToCustomCallout(div) + -- Check if the div has classes + for _, class in ipairs(div.classes) do + + -- Check if the class matches a custom callout + local callout = customCallouts[class] + + if callout then + + -- Create a new Callout with the custom callout parameters + local calloutParams = { + type = callout.type, + content = div.content, + title = div.attributes.title or callout.title, + icon = div.attributes.icon or callout.icon, + appearance = div.attributes.appearance or callout.appearance, + collapse = div.attributes.collapse or callout.collapse + } + + return quarto.Callout(calloutParams) + end + end + + + return div +end + +-- Main filter function +local function customCalloutFilter(doc) + + -- Walk the AST and process divs + doc.blocks = doc.blocks:walk({ + Div = convertToCustomCallout + }) + + -- Return the modified document + return doc +end + +-- Return the Pandoc filter +return { + Meta = parseCustomCallouts, + Pandoc = customCalloutFilter +} \ No newline at end of file diff --git a/Documentation/_extensions/coatless-quarto/custom-callout/fa.lua b/Documentation/_extensions/coatless-quarto/custom-callout/fa.lua new file mode 100644 index 0000000..feaebd5 --- /dev/null +++ b/Documentation/_extensions/coatless-quarto/custom-callout/fa.lua @@ -0,0 +1,1896 @@ +local fa_icons = { + ["fa-0"] = "\\30", + ["fa-1"] = "\\31", + ["fa-2"] = "\\32", + ["fa-3"] = "\\33", + ["fa-4"] = "\\34", + ["fa-5"] = "\\35", + ["fa-6"] = "\\36", + ["fa-7"] = "\\37", + ["fa-8"] = "\\38", + ["fa-9"] = "\\39", + ["fa-fill-drip"] = "\\f576", + ["fa-arrows-to-circle"] = "\\e4bd", + ["fa-circle-chevron-right"] = "\\f138", + ["fa-at"] = "\\40", + ["fa-trash-can"] = "\\f2ed", + ["fa-text-height"] = "\\f034", + ["fa-user-xmark"] = "\\f235", + ["fa-stethoscope"] = "\\f0f1", + ["fa-message"] = "\\f27a", + ["fa-info"] = "\\f129", + ["fa-down-left-and-up-right-to-center"] = "\\f422", + ["fa-explosion"] = "\\e4e9", + ["fa-file-text"] = "\\f15c", + ["fa-wave-square"] = "\\f83e", + ["fa-ring"] = "\\f70b", + ["fa-building-un"] = "\\e4d9", + ["fa-dice-three"] = "\\f527", + ["fa-calendar-days"] = "\\f073", + ["fa-anchor-circle-check"] = "\\e4aa", + ["fa-building-circle-arrow-right"] = "\\e4d1", + ["fa-volleyball"] = "\\f45f", + ["fa-arrows-up-to-line"] = "\\e4c2", + ["fa-sort-down"] = "\\f0dd", + ["fa-minus-circle"] = "\\f056", + ["fa-door-open"] = "\\f52b", + ["fa-sign-out-alt"] = "\\f2f5", + ["fa-atom"] = "\\f5d2", + ["fa-soap"] = "\\e06e", + ["fa-icons"] = "\\f86d", + ["fa-microphone-lines-slash"] = "\\f539", + ["fa-bridge-circle-check"] = "\\e4c9", + ["fa-pump-medical"] = "\\e06a", + ["fa-fingerprint"] = "\\f577", + ["fa-hand-point-right"] = "\\f0a4", + ["fa-search-location"] = "\\f689", + ["fa-step-forward"] = "\\f051", + ["fa-smile-beam"] = "\\f5b8", + ["fa-flag-checkered"] = "\\f11e", + ["fa-football"] = "\\f44e", + ["fa-school-circle-exclamation"] = "\\e56c", + ["fa-crop"] = "\\f125", + ["fa-angles-down"] = "\\f103", + ["fa-users-rectangle"] = "\\e594", + ["fa-people-roof"] = "\\e537", + ["fa-people-line"] = "\\e534", + ["fa-beer"] = "\\f0fc", + ["fa-diagram-predecessor"] = "\\e477", + ["fa-long-arrow-up"] = "\\f176", + ["fa-fire-flame-simple"] = "\\f46a", + ["fa-person"] = "\\f183", + ["fa-laptop"] = "\\f109", + ["fa-file-csv"] = "\\f6dd", + ["fa-menorah"] = "\\f676", + ["fa-truck-plane"] = "\\e58f", + ["fa-record-vinyl"] = "\\f8d9", + ["fa-grin-stars"] = "\\f587", + ["fa-bong"] = "\\f55c", + ["fa-spaghetti-monster-flying"] = "\\f67b", + ["fa-arrow-down-up-across-line"] = "\\e4af", + ["fa-utensil-spoon"] = "\\f2e5", + ["fa-jar-wheat"] = "\\e517", + ["fa-mail-bulk"] = "\\f674", + ["fa-file-circle-exclamation"] = "\\e4eb", + ["fa-hospital-symbol"] = "\\f47e", + ["fa-pager"] = "\\f815", + ["fa-contact-book"] = "\\f2b9", + ["fa-strikethrough"] = "\\f0cc", + ["fa-k"] = "\\4b", + ["fa-landmark-flag"] = "\\e51c", + ["fa-pencil"] = "\\f303", + ["fa-backward"] = "\\f04a", + ["fa-caret-right"] = "\\f0da", + ["fa-comments"] = "\\f086", + ["fa-paste"] = "\\f0ea", + ["fa-code-pull-request"] = "\\e13c", + ["fa-clipboard-list"] = "\\f46d", + ["fa-truck-ramp-box"] = "\\f4de", + ["fa-user-check"] = "\\f4fc", + ["fa-vial-virus"] = "\\e597", + ["fa-sheet-plastic"] = "\\e571", + ["fa-blog"] = "\\f781", + ["fa-user-ninja"] = "\\f504", + ["fa-person-arrow-up-from-line"] = "\\e539", + ["fa-torah"] = "\\f6a0", + ["fa-quidditch"] = "\\f458", + ["fa-toggle-off"] = "\\f204", + ["fa-box-archive"] = "\\f187", + ["fa-person-drowning"] = "\\e545", + ["fa-sort-numeric-down-alt"] = "\\f886", + ["fa-grin-tongue-squint"] = "\\f58a", + ["fa-spray-can"] = "\\f5bd", + ["fa-truck-monster"] = "\\f63b", + ["fa-w"] = "\\57", + ["fa-globe-africa"] = "\\f57c", + ["fa-rainbow"] = "\\f75b", + ["fa-circle-notch"] = "\\f1ce", + ["fa-tablet-screen-button"] = "\\f3fa", + ["fa-paw"] = "\\f1b0", + ["fa-cloud"] = "\\f0c2", + ["fa-trowel-bricks"] = "\\e58a", + ["fa-flushed"] = "\\f579", + ["fa-hospital-user"] = "\\f80d", + ["fa-tent-arrow-left-right"] = "\\e57f", + ["fa-legal"] = "\\f0e3", + ["fa-binoculars"] = "\\f1e5", + ["fa-microphone-slash"] = "\\f131", + ["fa-box-tissue"] = "\\e05b", + ["fa-motorcycle"] = "\\f21c", + ["fa-concierge-bell"] = "\\f562", + ["fa-pencil-ruler"] = "\\f5ae", + ["fa-people-arrows"] = "\\e068", + ["fa-mars-and-venus-burst"] = "\\e523", + ["fa-square-caret-right"] = "\\f152", + ["fa-scissors"] = "\\f0c4", + ["fa-sun-plant-wilt"] = "\\e57a", + ["fa-toilets-portable"] = "\\e584", + ["fa-hockey-puck"] = "\\f453", + ["fa-table"] = "\\f0ce", + ["fa-magnifying-glass-arrow-right"] = "\\e521", + ["fa-tachograph-digital"] = "\\f566", + ["fa-users-slash"] = "\\e073", + ["fa-clover"] = "\\e139", + ["fa-reply"] = "\\f3e5", + ["fa-star-and-crescent"] = "\\f699", + ["fa-house-fire"] = "\\e50c", + ["fa-square-minus"] = "\\f146", + ["fa-helicopter"] = "\\f533", + ["fa-compass"] = "\\f14e", + ["fa-square-caret-down"] = "\\f150", + ["fa-file-circle-question"] = "\\e4ef", + ["fa-laptop-code"] = "\\f5fc", + ["fa-swatchbook"] = "\\f5c3", + ["fa-prescription-bottle"] = "\\f485", + ["fa-navicon"] = "\\f0c9", + ["fa-people-group"] = "\\e533", + ["fa-hourglass-end"] = "\\f253", + ["fa-heart-crack"] = "\\f7a9", + ["fa-square-up-right"] = "\\f360", + ["fa-kiss-beam"] = "\\f597", + ["fa-film"] = "\\f008", + ["fa-ruler-horizontal"] = "\\f547", + ["fa-people-robbery"] = "\\e536", + ["fa-lightbulb"] = "\\f0eb", + ["fa-caret-left"] = "\\f0d9", + ["fa-exclamation-circle"] = "\\f06a", + ["fa-school-circle-xmark"] = "\\e56d", + ["fa-sign-out"] = "\\f08b", + ["fa-circle-chevron-down"] = "\\f13a", + ["fa-unlock-keyhole"] = "\\f13e", + ["fa-cloud-showers-heavy"] = "\\f740", + ["fa-headphones-simple"] = "\\f58f", + ["fa-sitemap"] = "\\f0e8", + ["fa-donate"] = "\\f4b9", + ["fa-memory"] = "\\f538", + ["fa-road-spikes"] = "\\e568", + ["fa-fire-burner"] = "\\e4f1", + ["fa-flag"] = "\\f024", + ["fa-hanukiah"] = "\\f6e6", + ["fa-feather"] = "\\f52d", + ["fa-volume-low"] = "\\f027", + ["fa-comment-slash"] = "\\f4b3", + ["fa-cloud-sun-rain"] = "\\f743", + ["fa-compress"] = "\\f066", + ["fa-wheat-awn"] = "\\e2cd", + ["fa-ankh"] = "\\f644", + ["fa-hands-holding-child"] = "\\e4fa", + ["fa-asterisk"] = "\\2a", + ["fa-square-check"] = "\\f14a", + ["fa-peseta-sign"] = "\\e221", + ["fa-heading"] = "\\f1dc", + ["fa-ghost"] = "\\f6e2", + ["fa-list"] = "\\f03a", + ["fa-square-phone-flip"] = "\\f87b", + ["fa-cart-plus"] = "\\f217", + ["fa-gamepad"] = "\\f11b", + ["fa-dot-circle"] = "\\f192", + ["fa-face-dizzy"] = "\\f567", + ["fa-egg"] = "\\f7fb", + ["fa-house-medical-circle-xmark"] = "\\e513", + ["fa-campground"] = "\\f6bb", + ["fa-folder-plus"] = "\\f65e", + ["fa-soccer-ball"] = "\\f1e3", + ["fa-paintbrush"] = "\\f1fc", + ["fa-lock"] = "\\f023", + ["fa-gas-pump"] = "\\f52f", + ["fa-hot-tub"] = "\\f593", + ["fa-map-marked"] = "\\f59f", + ["fa-house-flood-water"] = "\\e50e", + ["fa-tree"] = "\\f1bb", + ["fa-bridge-lock"] = "\\e4cc", + ["fa-sack-dollar"] = "\\f81d", + ["fa-pen-to-square"] = "\\f044", + ["fa-car-side"] = "\\f5e4", + ["fa-share-nodes"] = "\\f1e0", + ["fa-heart-circle-minus"] = "\\e4ff", + ["fa-hourglass-half"] = "\\f252", + ["fa-microscope"] = "\\f610", + ["fa-sink"] = "\\e06d", + ["fa-shopping-bag"] = "\\f290", + ["fa-sort-alpha-down-alt"] = "\\f881", + ["fa-mitten"] = "\\f7b5", + ["fa-person-rays"] = "\\e54d", + ["fa-users"] = "\\f0c0", + ["fa-eye-slash"] = "\\f070", + ["fa-flask-vial"] = "\\e4f3", + ["fa-hand"] = "\\f256", + ["fa-om"] = "\\f679", + ["fa-worm"] = "\\e599", + ["fa-house-circle-xmark"] = "\\e50b", + ["fa-plug"] = "\\f1e6", + ["fa-chevron-up"] = "\\f077", + ["fa-hand-spock"] = "\\f259", + ["fa-stopwatch"] = "\\f2f2", + ["fa-kiss"] = "\\f596", + ["fa-bridge-circle-xmark"] = "\\e4cb", + ["fa-grin-tongue"] = "\\f589", + ["fa-chess-bishop"] = "\\f43a", + ["fa-grin-wink"] = "\\f58c", + ["fa-hard-of-hearing"] = "\\f2a4", + ["fa-road-circle-check"] = "\\e564", + ["fa-dice-five"] = "\\f523", + ["fa-square-rss"] = "\\f143", + ["fa-land-mine-on"] = "\\e51b", + ["fa-i-cursor"] = "\\f246", + ["fa-stamp"] = "\\f5bf", + ["fa-stairs"] = "\\e289", + ["fa-i"] = "\\49", + ["fa-hryvnia"] = "\\f6f2", + ["fa-pills"] = "\\f484", + ["fa-grin-alt"] = "\\f581", + ["fa-tooth"] = "\\f5c9", + ["fa-v"] = "\\56", + ["fa-bangladeshi-taka-sign"] = "\\e2e6", + ["fa-bicycle"] = "\\f206", + ["fa-staff-snake"] = "\\e579", + ["fa-head-side-cough-slash"] = "\\e062", + ["fa-truck-medical"] = "\\f0f9", + ["fa-wheat-awn-circle-exclamation"] = "\\e598", + ["fa-snowman"] = "\\f7d0", + ["fa-mortar-pestle"] = "\\f5a7", + ["fa-road-barrier"] = "\\e562", + ["fa-school"] = "\\f549", + ["fa-igloo"] = "\\f7ae", + ["fa-joint"] = "\\f595", + ["fa-angle-right"] = "\\f105", + ["fa-horse"] = "\\f6f0", + ["fa-q"] = "\\51", + ["fa-g"] = "\\47", + ["fa-notes-medical"] = "\\f481", + ["fa-thermometer-half"] = "\\f2c9", + ["fa-dong-sign"] = "\\e169", + ["fa-capsules"] = "\\f46b", + ["fa-poo-storm"] = "\\f75a", + ["fa-frown-open"] = "\\f57a", + ["fa-hand-point-up"] = "\\f0a6", + ["fa-money-bill"] = "\\f0d6", + ["fa-bookmark"] = "\\f02e", + ["fa-align-justify"] = "\\f039", + ["fa-umbrella-beach"] = "\\f5ca", + ["fa-helmet-un"] = "\\e503", + ["fa-bullseye"] = "\\f140", + ["fa-bacon"] = "\\f7e5", + ["fa-hand-point-down"] = "\\f0a7", + ["fa-arrow-up-from-bracket"] = "\\e09a", + ["fa-folder"] = "\\f07b", + ["fa-file-waveform"] = "\\f478", + ["fa-radiation"] = "\\f7b9", + ["fa-chart-simple"] = "\\e473", + ["fa-mars-stroke"] = "\\f229", + ["fa-vial"] = "\\f492", + ["fa-tachometer-alt-average"] = "\\f624", + ["fa-wand-magic-sparkles"] = "\\e2ca", + ["fa-e"] = "\\45", + ["fa-pen-clip"] = "\\f305", + ["fa-bridge-circle-exclamation"] = "\\e4ca", + ["fa-user"] = "\\f007", + ["fa-school-circle-check"] = "\\e56b", + ["fa-dumpster"] = "\\f793", + ["fa-van-shuttle"] = "\\f5b6", + ["fa-building-user"] = "\\e4da", + ["fa-square-caret-left"] = "\\f191", + ["fa-highlighter"] = "\\f591", + ["fa-key"] = "\\f084", + ["fa-bullhorn"] = "\\f0a1", + ["fa-globe"] = "\\f0ac", + ["fa-synagogue"] = "\\f69b", + ["fa-person-half-dress"] = "\\e548", + ["fa-road-bridge"] = "\\e563", + ["fa-location-arrow"] = "\\f124", + ["fa-c"] = "\\43", + ["fa-tablet-button"] = "\\f10a", + ["fa-building-lock"] = "\\e4d6", + ["fa-pizza-slice"] = "\\f818", + ["fa-money-bill-wave"] = "\\f53a", + ["fa-chart-area"] = "\\f1fe", + ["fa-house-flag"] = "\\e50d", + ["fa-person-circle-minus"] = "\\e540", + ["fa-cancel"] = "\\f05e", + ["fa-camera-rotate"] = "\\e0d8", + ["fa-spray-can-sparkles"] = "\\f5d0", + ["fa-star"] = "\\f005", + ["fa-repeat"] = "\\f363", + ["fa-cross"] = "\\f654", + ["fa-box"] = "\\f466", + ["fa-venus-mars"] = "\\f228", + ["fa-mouse-pointer"] = "\\f245", + ["fa-maximize"] = "\\f31e", + ["fa-charging-station"] = "\\f5e7", + ["fa-triangle-circle-square"] = "\\f61f", + ["fa-shuffle"] = "\\f074", + ["fa-running"] = "\\f70c", + ["fa-mobile-retro"] = "\\e527", + ["fa-grip-lines-vertical"] = "\\f7a5", + ["fa-spider"] = "\\f717", + ["fa-hands-bound"] = "\\e4f9", + ["fa-file-invoice-dollar"] = "\\f571", + ["fa-plane-circle-exclamation"] = "\\e556", + ["fa-x-ray"] = "\\f497", + ["fa-spell-check"] = "\\f891", + ["fa-slash"] = "\\f715", + ["fa-mouse"] = "\\f8cc", + ["fa-sign-in"] = "\\f090", + ["fa-store-alt-slash"] = "\\e070", + ["fa-server"] = "\\f233", + ["fa-virus-covid-slash"] = "\\e4a9", + ["fa-shop-lock"] = "\\e4a5", + ["fa-hourglass-start"] = "\\f251", + ["fa-blender-phone"] = "\\f6b6", + ["fa-building-wheat"] = "\\e4db", + ["fa-person-breastfeeding"] = "\\e53a", + ["fa-sign-in-alt"] = "\\f2f6", + ["fa-venus"] = "\\f221", + ["fa-passport"] = "\\f5ab", + ["fa-thumbtack-slash"] = "\\e68f", + ["fa-heartbeat"] = "\\f21e", + ["fa-people-carry"] = "\\f4ce", + ["fa-temperature-high"] = "\\f769", + ["fa-microchip"] = "\\f2db", + ["fa-crown"] = "\\f521", + ["fa-weight-hanging"] = "\\f5cd", + ["fa-xmarks-lines"] = "\\e59a", + ["fa-file-prescription"] = "\\f572", + ["fa-weight"] = "\\f496", + ["fa-user-group"] = "\\f500", + ["fa-sort-alpha-up"] = "\\f15e", + ["fa-chess-knight"] = "\\f441", + ["fa-laugh-squint"] = "\\f59b", + ["fa-wheelchair"] = "\\f193", + ["fa-circle-arrow-up"] = "\\f0aa", + ["fa-toggle-on"] = "\\f205", + ["fa-walking"] = "\\f554", + ["fa-l"] = "\\4c", + ["fa-fire"] = "\\f06d", + ["fa-procedures"] = "\\f487", + ["fa-space-shuttle"] = "\\f197", + ["fa-laugh"] = "\\f599", + ["fa-folder-open"] = "\\f07c", + ["fa-heart-circle-plus"] = "\\e500", + ["fa-code-fork"] = "\\e13b", + ["fa-city"] = "\\f64f", + ["fa-microphone-lines"] = "\\f3c9", + ["fa-pepper-hot"] = "\\f816", + ["fa-unlock"] = "\\f09c", + ["fa-colon-sign"] = "\\e140", + ["fa-headset"] = "\\f590", + ["fa-store-slash"] = "\\e071", + ["fa-road-circle-xmark"] = "\\e566", + ["fa-user-minus"] = "\\f503", + ["fa-mars-stroke-v"] = "\\f22a", + ["fa-glass-cheers"] = "\\f79f", + ["fa-clipboard"] = "\\f328", + ["fa-house-circle-exclamation"] = "\\e50a", + ["fa-file-upload"] = "\\f574", + ["fa-wifi"] = "\\f1eb", + ["fa-bathtub"] = "\\f2cd", + ["fa-underline"] = "\\f0cd", + ["fa-user-pen"] = "\\f4ff", + ["fa-signature"] = "\\f5b7", + ["fa-stroopwafel"] = "\\f551", + ["fa-bold"] = "\\f032", + ["fa-anchor-lock"] = "\\e4ad", + ["fa-building-ngo"] = "\\e4d7", + ["fa-manat-sign"] = "\\e1d5", + ["fa-not-equal"] = "\\f53e", + ["fa-border-top-left"] = "\\f853", + ["fa-map-marked-alt"] = "\\f5a0", + ["fa-jedi"] = "\\f669", + ["fa-square-poll-vertical"] = "\\f681", + ["fa-mug-hot"] = "\\f7b6", + ["fa-car-battery"] = "\\f5df", + ["fa-gift"] = "\\f06b", + ["fa-dice-two"] = "\\f528", + ["fa-chess-queen"] = "\\f445", + ["fa-glasses"] = "\\f530", + ["fa-chess-board"] = "\\f43c", + ["fa-building-circle-check"] = "\\e4d2", + ["fa-person-chalkboard"] = "\\e53d", + ["fa-mars-stroke-right"] = "\\f22b", + ["fa-hand-rock"] = "\\f255", + ["fa-square-caret-up"] = "\\f151", + ["fa-cloud-showers-water"] = "\\e4e4", + ["fa-chart-bar"] = "\\f080", + ["fa-hands-wash"] = "\\e05e", + ["fa-less-than-equal"] = "\\f537", + ["fa-train"] = "\\f238", + ["fa-low-vision"] = "\\f2a8", + ["fa-crow"] = "\\f520", + ["fa-sailboat"] = "\\e445", + ["fa-window-restore"] = "\\f2d2", + ["fa-square-plus"] = "\\f0fe", + ["fa-torii-gate"] = "\\f6a1", + ["fa-frog"] = "\\f52e", + ["fa-bucket"] = "\\e4cf", + ["fa-image"] = "\\f03e", + ["fa-microphone"] = "\\f130", + ["fa-cow"] = "\\f6c8", + ["fa-caret-up"] = "\\f0d8", + ["fa-screwdriver"] = "\\f54a", + ["fa-folder-closed"] = "\\e185", + ["fa-house-tsunami"] = "\\e515", + ["fa-square-nfi"] = "\\e576", + ["fa-arrow-up-from-ground-water"] = "\\e4b5", + ["fa-martini-glass"] = "\\f57b", + ["fa-undo-alt"] = "\\f2ea", + ["fa-table-columns"] = "\\f0db", + ["fa-lemon"] = "\\f094", + ["fa-head-side-mask"] = "\\e063", + ["fa-handshake"] = "\\f2b5", + ["fa-gem"] = "\\f3a5", + ["fa-dolly"] = "\\f472", + ["fa-smoking"] = "\\f48d", + ["fa-minimize"] = "\\f78c", + ["fa-monument"] = "\\f5a6", + ["fa-snowplow"] = "\\f7d2", + ["fa-angles-right"] = "\\f101", + ["fa-cannabis"] = "\\f55f", + ["fa-play-circle"] = "\\f144", + ["fa-tablets"] = "\\f490", + ["fa-ethernet"] = "\\f796", + ["fa-euro"] = "\\f153", + ["fa-chair"] = "\\f6c0", + ["fa-circle-check"] = "\\f058", + ["fa-stop-circle"] = "\\f28d", + ["fa-drafting-compass"] = "\\f568", + ["fa-plate-wheat"] = "\\e55a", + ["fa-icicles"] = "\\f7ad", + ["fa-person-shelter"] = "\\e54f", + ["fa-neuter"] = "\\f22c", + ["fa-id-badge"] = "\\f2c1", + ["fa-marker"] = "\\f5a1", + ["fa-laugh-beam"] = "\\f59a", + ["fa-helicopter-symbol"] = "\\e502", + ["fa-universal-access"] = "\\f29a", + ["fa-circle-chevron-up"] = "\\f139", + ["fa-lari-sign"] = "\\e1c8", + ["fa-volcano"] = "\\f770", + ["fa-person-walking-dashed-line-arrow-right"] = "\\e553", + ["fa-sterling-sign"] = "\\f154", + ["fa-viruses"] = "\\e076", + ["fa-square-person-confined"] = "\\e577", + ["fa-user-tie"] = "\\f508", + ["fa-long-arrow-down"] = "\\f175", + ["fa-tent-arrow-down-to-line"] = "\\e57e", + ["fa-certificate"] = "\\f0a3", + ["fa-reply-all"] = "\\f122", + ["fa-suitcase"] = "\\f0f2", + ["fa-skating"] = "\\f7c5", + ["fa-funnel-dollar"] = "\\f662", + ["fa-camera-retro"] = "\\f083", + ["fa-circle-arrow-down"] = "\\f0ab", + ["fa-file-import"] = "\\f56f", + ["fa-square-arrow-up-right"] = "\\f14c", + ["fa-box-open"] = "\\f49e", + ["fa-scroll"] = "\\f70e", + ["fa-spa"] = "\\f5bb", + ["fa-location-pin-lock"] = "\\e51f", + ["fa-pause"] = "\\f04c", + ["fa-hill-avalanche"] = "\\e507", + ["fa-thermometer-empty"] = "\\f2cb", + ["fa-bomb"] = "\\f1e2", + ["fa-registered"] = "\\f25d", + ["fa-vcard"] = "\\f2bb", + ["fa-scale-unbalanced-flip"] = "\\f516", + ["fa-subscript"] = "\\f12c", + ["fa-directions"] = "\\f5eb", + ["fa-burst"] = "\\e4dc", + ["fa-laptop-house"] = "\\e066", + ["fa-tired"] = "\\f5c8", + ["fa-money-bills"] = "\\e1f3", + ["fa-smog"] = "\\f75f", + ["fa-crutch"] = "\\f7f7", + ["fa-cloud-upload"] = "\\f0ee", + ["fa-palette"] = "\\f53f", + ["fa-arrows-turn-right"] = "\\e4c0", + ["fa-vest"] = "\\e085", + ["fa-ferry"] = "\\e4ea", + ["fa-arrows-down-to-people"] = "\\e4b9", + ["fa-sprout"] = "\\f4d8", + ["fa-left-right"] = "\\f337", + ["fa-boxes-packing"] = "\\e4c7", + ["fa-circle-arrow-left"] = "\\f0a8", + ["fa-group-arrows-rotate"] = "\\e4f6", + ["fa-bowl-food"] = "\\e4c6", + ["fa-candy-cane"] = "\\f786", + ["fa-sort-amount-down"] = "\\f160", + ["fa-thunderstorm"] = "\\f76c", + ["fa-text-slash"] = "\\f87d", + ["fa-smile-wink"] = "\\f4da", + ["fa-file-word"] = "\\f1c2", + ["fa-file-powerpoint"] = "\\f1c4", + ["fa-arrows-left-right"] = "\\f07e", + ["fa-house-lock"] = "\\e510", + ["fa-cloud-download"] = "\\f0ed", + ["fa-children"] = "\\e4e1", + ["fa-chalkboard"] = "\\f51b", + ["fa-user-large-slash"] = "\\f4fa", + ["fa-envelope-open"] = "\\f2b6", + ["fa-handshake-simple-slash"] = "\\e05f", + ["fa-mattress-pillow"] = "\\e525", + ["fa-guarani-sign"] = "\\e19a", + ["fa-sync"] = "\\f021", + ["fa-fire-extinguisher"] = "\\f134", + ["fa-cruzeiro-sign"] = "\\e152", + ["fa-greater-than-equal"] = "\\f532", + ["fa-shield-halved"] = "\\f3ed", + ["fa-book-atlas"] = "\\f558", + ["fa-virus"] = "\\e074", + ["fa-envelope-circle-check"] = "\\e4e8", + ["fa-layer-group"] = "\\f5fd", + ["fa-arrows-to-dot"] = "\\e4be", + ["fa-archway"] = "\\f557", + ["fa-heart-circle-check"] = "\\e4fd", + ["fa-house-damage"] = "\\f6f1", + ["fa-file-zipper"] = "\\f1c6", + ["fa-square"] = "\\f0c8", + ["fa-martini-glass-empty"] = "\\f000", + ["fa-couch"] = "\\f4b8", + ["fa-cedi-sign"] = "\\e0df", + ["fa-italic"] = "\\f033", + ["fa-table-cells-column-lock"] = "\\e678", + ["fa-church"] = "\\f51d", + ["fa-comments-dollar"] = "\\f653", + ["fa-democrat"] = "\\f747", + ["fa-z"] = "\\5a", + ["fa-skiing"] = "\\f7c9", + ["fa-road-lock"] = "\\e567", + ["fa-a"] = "\\41", + ["fa-temperature-down"] = "\\e03f", + ["fa-feather-pointed"] = "\\f56b", + ["fa-p"] = "\\50", + ["fa-snowflake"] = "\\f2dc", + ["fa-newspaper"] = "\\f1ea", + ["fa-rectangle-ad"] = "\\f641", + ["fa-circle-arrow-right"] = "\\f0a9", + ["fa-filter-circle-xmark"] = "\\e17b", + ["fa-locust"] = "\\e520", + ["fa-unsorted"] = "\\f0dc", + ["fa-list-ol"] = "\\f0cb", + ["fa-person-dress-burst"] = "\\e544", + ["fa-money-check-dollar"] = "\\f53d", + ["fa-vector-square"] = "\\f5cb", + ["fa-bread-slice"] = "\\f7ec", + ["fa-language"] = "\\f1ab", + ["fa-kiss-wink-heart"] = "\\f598", + ["fa-filter"] = "\\f0b0", + ["fa-question"] = "\\3f", + ["fa-file-signature"] = "\\f573", + ["fa-up-down-left-right"] = "\\f0b2", + ["fa-house-chimney-user"] = "\\e065", + ["fa-hand-holding-heart"] = "\\f4be", + ["fa-puzzle-piece"] = "\\f12e", + ["fa-money-check"] = "\\f53c", + ["fa-star-half-stroke"] = "\\f5c0", + ["fa-code"] = "\\f121", + ["fa-whiskey-glass"] = "\\f7a0", + ["fa-building-circle-exclamation"] = "\\e4d3", + ["fa-magnifying-glass-chart"] = "\\e522", + ["fa-external-link"] = "\\f08e", + ["fa-cubes-stacked"] = "\\e4e6", + ["fa-won"] = "\\f159", + ["fa-virus-covid"] = "\\e4a8", + ["fa-austral-sign"] = "\\e0a9", + ["fa-f"] = "\\46", + ["fa-leaf"] = "\\f06c", + ["fa-road"] = "\\f018", + ["fa-taxi"] = "\\f1ba", + ["fa-person-circle-plus"] = "\\e541", + ["fa-pie-chart"] = "\\f200", + ["fa-bolt-lightning"] = "\\e0b7", + ["fa-sack-xmark"] = "\\e56a", + ["fa-file-excel"] = "\\f1c3", + ["fa-file-contract"] = "\\f56c", + ["fa-fish-fins"] = "\\e4f2", + ["fa-building-flag"] = "\\e4d5", + ["fa-grin-beam"] = "\\f582", + ["fa-object-ungroup"] = "\\f248", + ["fa-poop"] = "\\f619", + ["fa-map-marker"] = "\\f041", + ["fa-kaaba"] = "\\f66b", + ["fa-toilet-paper"] = "\\f71e", + ["fa-helmet-safety"] = "\\f807", + ["fa-eject"] = "\\f052", + ["fa-circle-right"] = "\\f35a", + ["fa-plane-circle-check"] = "\\e555", + ["fa-meh-rolling-eyes"] = "\\f5a5", + ["fa-object-group"] = "\\f247", + ["fa-line-chart"] = "\\f201", + ["fa-mask-ventilator"] = "\\e524", + ["fa-arrow-right"] = "\\f061", + ["fa-signs-post"] = "\\f277", + ["fa-cash-register"] = "\\f788", + ["fa-person-circle-question"] = "\\e542", + ["fa-h"] = "\\48", + ["fa-tarp"] = "\\e57b", + ["fa-tools"] = "\\f7d9", + ["fa-arrows-to-eye"] = "\\e4bf", + ["fa-plug-circle-bolt"] = "\\e55b", + ["fa-heart"] = "\\f004", + ["fa-mars-and-venus"] = "\\f224", + ["fa-house-user"] = "\\e1b0", + ["fa-dumpster-fire"] = "\\f794", + ["fa-house-crack"] = "\\e3b1", + ["fa-martini-glass-citrus"] = "\\f561", + ["fa-surprise"] = "\\f5c2", + ["fa-bottle-water"] = "\\e4c5", + ["fa-pause-circle"] = "\\f28b", + ["fa-toilet-paper-slash"] = "\\e072", + ["fa-apple-whole"] = "\\f5d1", + ["fa-kitchen-set"] = "\\e51a", + ["fa-r"] = "\\52", + ["fa-thermometer-quarter"] = "\\f2ca", + ["fa-cube"] = "\\f1b2", + ["fa-bitcoin-sign"] = "\\e0b4", + ["fa-shield-dog"] = "\\e573", + ["fa-solar-panel"] = "\\f5ba", + ["fa-lock-open"] = "\\f3c1", + ["fa-elevator"] = "\\e16d", + ["fa-money-bill-transfer"] = "\\e528", + ["fa-money-bill-trend-up"] = "\\e529", + ["fa-house-flood-water-circle-arrow-right"] = "\\e50f", + ["fa-square-poll-horizontal"] = "\\f682", + ["fa-circle"] = "\\f111", + ["fa-fast-backward"] = "\\f049", + ["fa-recycle"] = "\\f1b8", + ["fa-user-astronaut"] = "\\f4fb", + ["fa-plane-slash"] = "\\e069", + ["fa-trademark"] = "\\f25c", + ["fa-basketball"] = "\\f434", + ["fa-satellite-dish"] = "\\f7c0", + ["fa-circle-up"] = "\\f35b", + ["fa-mobile-screen-button"] = "\\f3cd", + ["fa-volume-up"] = "\\f028", + ["fa-users-rays"] = "\\e593", + ["fa-wallet"] = "\\f555", + ["fa-clipboard-check"] = "\\f46c", + ["fa-file-audio"] = "\\f1c7", + ["fa-hamburger"] = "\\f805", + ["fa-wrench"] = "\\f0ad", + ["fa-bugs"] = "\\e4d0", + ["fa-rupee"] = "\\f156", + ["fa-file-image"] = "\\f1c5", + ["fa-question-circle"] = "\\f059", + ["fa-plane-departure"] = "\\f5b0", + ["fa-handshake-slash"] = "\\e060", + ["fa-book-bookmark"] = "\\e0bb", + ["fa-code-branch"] = "\\f126", + ["fa-hat-cowboy"] = "\\f8c0", + ["fa-bridge"] = "\\e4c8", + ["fa-phone-flip"] = "\\f879", + ["fa-truck-front"] = "\\e2b7", + ["fa-cat"] = "\\f6be", + ["fa-anchor-circle-exclamation"] = "\\e4ab", + ["fa-truck-field"] = "\\e58d", + ["fa-route"] = "\\f4d7", + ["fa-clipboard-question"] = "\\e4e3", + ["fa-panorama"] = "\\e209", + ["fa-comment-medical"] = "\\f7f5", + ["fa-teeth-open"] = "\\f62f", + ["fa-file-circle-minus"] = "\\e4ed", + ["fa-tags"] = "\\f02c", + ["fa-wine-glass"] = "\\f4e3", + ["fa-forward-fast"] = "\\f050", + ["fa-meh-blank"] = "\\f5a4", + ["fa-square-parking"] = "\\f540", + ["fa-house-signal"] = "\\e012", + ["fa-tasks-alt"] = "\\f828", + ["fa-faucet-drip"] = "\\e006", + ["fa-dolly-flatbed"] = "\\f474", + ["fa-smoking-ban"] = "\\f54d", + ["fa-terminal"] = "\\f120", + ["fa-mobile-button"] = "\\f10b", + ["fa-house-medical-flag"] = "\\e514", + ["fa-shopping-basket"] = "\\f291", + ["fa-tape"] = "\\f4db", + ["fa-bus-simple"] = "\\f55e", + ["fa-eye"] = "\\f06e", + ["fa-sad-cry"] = "\\f5b3", + ["fa-audio-description"] = "\\f29e", + ["fa-person-military-to-person"] = "\\e54c", + ["fa-file-shield"] = "\\e4f0", + ["fa-user-slash"] = "\\f506", + ["fa-pen"] = "\\f304", + ["fa-tower-observation"] = "\\e586", + ["fa-file-code"] = "\\f1c9", + ["fa-signal"] = "\\f012", + ["fa-bus"] = "\\f207", + ["fa-heart-circle-xmark"] = "\\e501", + ["fa-house-chimney"] = "\\e3af", + ["fa-window-maximize"] = "\\f2d0", + ["fa-frown"] = "\\f119", + ["fa-prescription"] = "\\f5b1", + ["fa-store-alt"] = "\\f54f", + ["fa-save"] = "\\f0c7", + ["fa-vihara"] = "\\f6a7", + ["fa-scale-unbalanced"] = "\\f515", + ["fa-sort-up"] = "\\f0de", + ["fa-commenting"] = "\\f4ad", + ["fa-plant-wilt"] = "\\e5aa", + ["fa-diamond"] = "\\f219", + ["fa-grin-squint"] = "\\f585", + ["fa-hand-holding-usd"] = "\\f4c0", + ["fa-bacterium"] = "\\e05a", + ["fa-hand-pointer"] = "\\f25a", + ["fa-drum-steelpan"] = "\\f56a", + ["fa-hand-scissors"] = "\\f257", + ["fa-praying-hands"] = "\\f684", + ["fa-redo"] = "\\f01e", + ["fa-biohazard"] = "\\f780", + ["fa-location"] = "\\f601", + ["fa-mars-double"] = "\\f227", + ["fa-child-dress"] = "\\e59c", + ["fa-users-between-lines"] = "\\e591", + ["fa-lungs-virus"] = "\\e067", + ["fa-grin-tears"] = "\\f588", + ["fa-phone"] = "\\f095", + ["fa-calendar-xmark"] = "\\f273", + ["fa-child-reaching"] = "\\e59d", + ["fa-head-side-virus"] = "\\e064", + ["fa-user-gear"] = "\\f4fe", + ["fa-sort-numeric-up"] = "\\f163", + ["fa-door-closed"] = "\\f52a", + ["fa-shield-virus"] = "\\e06c", + ["fa-dice-six"] = "\\f526", + ["fa-mosquito-net"] = "\\e52c", + ["fa-bridge-water"] = "\\e4ce", + ["fa-person-booth"] = "\\f756", + ["fa-text-width"] = "\\f035", + ["fa-hat-wizard"] = "\\f6e8", + ["fa-pen-fancy"] = "\\f5ac", + ["fa-person-digging"] = "\\f85e", + ["fa-trash"] = "\\f1f8", + ["fa-tachometer-average"] = "\\f629", + ["fa-book-medical"] = "\\f7e6", + ["fa-poo"] = "\\f2fe", + ["fa-quote-right"] = "\\f10e", + ["fa-tshirt"] = "\\f553", + ["fa-cubes"] = "\\f1b3", + ["fa-divide"] = "\\f529", + ["fa-tenge"] = "\\f7d7", + ["fa-headphones"] = "\\f025", + ["fa-hands-holding"] = "\\f4c2", + ["fa-hands-clapping"] = "\\e1a8", + ["fa-republican"] = "\\f75e", + ["fa-arrow-left"] = "\\f060", + ["fa-person-circle-xmark"] = "\\e543", + ["fa-ruler"] = "\\f545", + ["fa-align-left"] = "\\f036", + ["fa-dice-d6"] = "\\f6d1", + ["fa-restroom"] = "\\f7bd", + ["fa-j"] = "\\4a", + ["fa-users-viewfinder"] = "\\e595", + ["fa-file-video"] = "\\f1c8", + ["fa-up-right-from-square"] = "\\f35d", + ["fa-th"] = "\\f00a", + ["fa-file-pdf"] = "\\f1c1", + ["fa-book-bible"] = "\\f647", + ["fa-o"] = "\\4f", + ["fa-suitcase-medical"] = "\\f0fa", + ["fa-user-secret"] = "\\f21b", + ["fa-otter"] = "\\f700", + ["fa-person-dress"] = "\\f182", + ["fa-comment-dollar"] = "\\f651", + ["fa-business-time"] = "\\f64a", + ["fa-th-large"] = "\\f009", + ["fa-tanakh"] = "\\f827", + ["fa-volume-control-phone"] = "\\f2a0", + ["fa-hat-cowboy-side"] = "\\f8c1", + ["fa-clipboard-user"] = "\\f7f3", + ["fa-child"] = "\\f1ae", + ["fa-lira-sign"] = "\\f195", + ["fa-satellite"] = "\\f7bf", + ["fa-plane-lock"] = "\\e558", + ["fa-tag"] = "\\f02b", + ["fa-comment"] = "\\f075", + ["fa-cake"] = "\\f1fd", + ["fa-envelope"] = "\\f0e0", + ["fa-angles-up"] = "\\f102", + ["fa-paperclip"] = "\\f0c6", + ["fa-arrow-right-to-city"] = "\\e4b3", + ["fa-ribbon"] = "\\f4d6", + ["fa-lungs"] = "\\f604", + ["fa-sort-numeric-up-alt"] = "\\f887", + ["fa-litecoin-sign"] = "\\e1d3", + ["fa-border-none"] = "\\f850", + ["fa-circle-nodes"] = "\\e4e2", + ["fa-parachute-box"] = "\\f4cd", + ["fa-indent"] = "\\f03c", + ["fa-truck-field-un"] = "\\e58e", + ["fa-hourglass"] = "\\f254", + ["fa-mountain"] = "\\f6fc", + ["fa-user-md"] = "\\f0f0", + ["fa-info-circle"] = "\\f05a", + ["fa-cloud-meatball"] = "\\f73b", + ["fa-camera"] = "\\f030", + ["fa-square-virus"] = "\\e578", + ["fa-meteor"] = "\\f753", + ["fa-car-on"] = "\\e4dd", + ["fa-sleigh"] = "\\f7cc", + ["fa-sort-numeric-down"] = "\\f162", + ["fa-hand-holding-water"] = "\\f4c1", + ["fa-water"] = "\\f773", + ["fa-calendar-check"] = "\\f274", + ["fa-braille"] = "\\f2a1", + ["fa-prescription-bottle-medical"] = "\\f486", + ["fa-landmark"] = "\\f66f", + ["fa-truck"] = "\\f0d1", + ["fa-crosshairs"] = "\\f05b", + ["fa-person-cane"] = "\\e53c", + ["fa-tent"] = "\\e57d", + ["fa-vest-patches"] = "\\e086", + ["fa-check-double"] = "\\f560", + ["fa-sort-alpha-down"] = "\\f15d", + ["fa-money-bill-wheat"] = "\\e52a", + ["fa-cookie"] = "\\f563", + ["fa-undo"] = "\\f0e2", + ["fa-hdd"] = "\\f0a0", + ["fa-grin-squint-tears"] = "\\f586", + ["fa-dumbbell"] = "\\f44b", + ["fa-rectangle-list"] = "\\f022", + ["fa-tarp-droplet"] = "\\e57c", + ["fa-house-medical-circle-check"] = "\\e511", + ["fa-skiing-nordic"] = "\\f7ca", + ["fa-calendar-plus"] = "\\f271", + ["fa-plane-arrival"] = "\\f5af", + ["fa-circle-left"] = "\\f359", + ["fa-train-subway"] = "\\f239", + ["fa-chart-gantt"] = "\\e0e4", + ["fa-inr"] = "\\e1bc", + ["fa-crop-simple"] = "\\f565", + ["fa-money-bill-alt"] = "\\f3d1", + ["fa-long-arrow-alt-left"] = "\\f30a", + ["fa-dna"] = "\\f471", + ["fa-virus-slash"] = "\\e075", + ["fa-subtract"] = "\\f068", + ["fa-chess"] = "\\f439", + ["fa-long-arrow-left"] = "\\f177", + ["fa-plug-circle-check"] = "\\e55c", + ["fa-street-view"] = "\\f21d", + ["fa-franc-sign"] = "\\e18f", + ["fa-volume-off"] = "\\f026", + ["fa-hands-asl-interpreting"] = "\\f2a3", + ["fa-gear"] = "\\f013", + ["fa-tint-slash"] = "\\f5c7", + ["fa-mosque"] = "\\f678", + ["fa-mosquito"] = "\\e52b", + ["fa-star-of-david"] = "\\f69a", + ["fa-person-military-rifle"] = "\\e54b", + ["fa-shopping-cart"] = "\\f07a", + ["fa-vials"] = "\\f493", + ["fa-plug-circle-plus"] = "\\e55f", + ["fa-place-of-worship"] = "\\f67f", + ["fa-grip-vertical"] = "\\f58e", + ["fa-level-up"] = "\\f148", + ["fa-u"] = "\\55", + ["fa-square-root-variable"] = "\\f698", + ["fa-clock"] = "\\f017", + ["fa-step-backward"] = "\\f048", + ["fa-pallet"] = "\\f482", + ["fa-faucet"] = "\\e005", + ["fa-baseball-bat-ball"] = "\\f432", + ["fa-s"] = "\\53", + ["fa-timeline"] = "\\e29c", + ["fa-keyboard"] = "\\f11c", + ["fa-caret-down"] = "\\f0d7", + ["fa-house-chimney-medical"] = "\\f7f2", + ["fa-thermometer-three-quarters"] = "\\f2c8", + ["fa-mobile-screen"] = "\\f3cf", + ["fa-plane-up"] = "\\e22d", + ["fa-piggy-bank"] = "\\f4d3", + ["fa-battery-half"] = "\\f242", + ["fa-mountain-city"] = "\\e52e", + ["fa-coins"] = "\\f51e", + ["fa-khanda"] = "\\f66d", + ["fa-sliders"] = "\\f1de", + ["fa-folder-tree"] = "\\f802", + ["fa-network-wired"] = "\\f6ff", + ["fa-map-pin"] = "\\f276", + ["fa-hamsa"] = "\\f665", + ["fa-cent-sign"] = "\\e3f5", + ["fa-flask"] = "\\f0c3", + ["fa-person-pregnant"] = "\\e31e", + ["fa-wand-sparkles"] = "\\f72b", + ["fa-ellipsis-vertical"] = "\\f142", + ["fa-ticket"] = "\\f145", + ["fa-power-off"] = "\\f011", + ["fa-right-long"] = "\\f30b", + ["fa-flag-usa"] = "\\f74d", + ["fa-laptop-file"] = "\\e51d", + ["fa-tty"] = "\\f1e4", + ["fa-diagram-next"] = "\\e476", + ["fa-person-rifle"] = "\\e54e", + ["fa-house-medical-circle-exclamation"] = "\\e512", + ["fa-closed-captioning"] = "\\f20a", + ["fa-person-hiking"] = "\\f6ec", + ["fa-venus-double"] = "\\f226", + ["fa-images"] = "\\f302", + ["fa-calculator"] = "\\f1ec", + ["fa-people-pulling"] = "\\e535", + ["fa-n"] = "\\4e", + ["fa-tram"] = "\\f7da", + ["fa-cloud-rain"] = "\\f73d", + ["fa-building-circle-xmark"] = "\\e4d4", + ["fa-ship"] = "\\f21a", + ["fa-arrows-down-to-line"] = "\\e4b8", + ["fa-download"] = "\\f019", + ["fa-grin"] = "\\f580", + ["fa-delete-left"] = "\\f55a", + ["fa-eyedropper"] = "\\f1fb", + ["fa-file-circle-check"] = "\\e5a0", + ["fa-forward"] = "\\f04e", + ["fa-mobile"] = "\\f3ce", + ["fa-meh"] = "\\f11a", + ["fa-align-center"] = "\\f037", + ["fa-book-skull"] = "\\f6b7", + ["fa-id-card"] = "\\f2c2", + ["fa-outdent"] = "\\f03b", + ["fa-heart-circle-exclamation"] = "\\e4fe", + ["fa-house"] = "\\f015", + ["fa-calendar-week"] = "\\f784", + ["fa-laptop-medical"] = "\\f812", + ["fa-b"] = "\\42", + ["fa-file-medical"] = "\\f477", + ["fa-dice-one"] = "\\f525", + ["fa-kiwi-bird"] = "\\f535", + ["fa-exchange"] = "\\f0ec", + ["fa-rotate-right"] = "\\f2f9", + ["fa-utensils"] = "\\f2e7", + ["fa-sort-amount-up"] = "\\f161", + ["fa-mill-sign"] = "\\e1ed", + ["fa-bowl-rice"] = "\\e2eb", + ["fa-skull"] = "\\f54c", + ["fa-tower-broadcast"] = "\\f519", + ["fa-truck-pickup"] = "\\f63c", + ["fa-up-long"] = "\\f30c", + ["fa-stop"] = "\\f04d", + ["fa-code-merge"] = "\\f387", + ["fa-upload"] = "\\f093", + ["fa-hurricane"] = "\\f751", + ["fa-mound"] = "\\e52d", + ["fa-toilet-portable"] = "\\e583", + ["fa-compact-disc"] = "\\f51f", + ["fa-file-download"] = "\\f56d", + ["fa-caravan"] = "\\f8ff", + ["fa-shield-cat"] = "\\e572", + ["fa-zap"] = "\\f0e7", + ["fa-glass-water"] = "\\e4f4", + ["fa-oil-well"] = "\\e532", + ["fa-vault"] = "\\e2c5", + ["fa-mars"] = "\\f222", + ["fa-toilet"] = "\\f7d8", + ["fa-plane-circle-xmark"] = "\\e557", + ["fa-yen"] = "\\f157", + ["fa-ruble"] = "\\f158", + ["fa-sun"] = "\\f185", + ["fa-guitar"] = "\\f7a6", + ["fa-laugh-wink"] = "\\f59c", + ["fa-horse-head"] = "\\f7ab", + ["fa-bore-hole"] = "\\e4c3", + ["fa-industry"] = "\\f275", + ["fa-circle-down"] = "\\f358", + ["fa-arrows-turn-to-dots"] = "\\e4c1", + ["fa-florin-sign"] = "\\e184", + ["fa-sort-amount-down-alt"] = "\\f884", + ["fa-less-than"] = "\\3c", + ["fa-angle-down"] = "\\f107", + ["fa-car-tunnel"] = "\\e4de", + ["fa-head-side-cough"] = "\\e061", + ["fa-grip-lines"] = "\\f7a4", + ["fa-thumbs-down"] = "\\f165", + ["fa-user-lock"] = "\\f502", + ["fa-long-arrow-right"] = "\\f178", + ["fa-anchor-circle-xmark"] = "\\e4ac", + ["fa-ellipsis"] = "\\f141", + ["fa-chess-pawn"] = "\\f443", + ["fa-kit-medical"] = "\\f479", + ["fa-person-through-window"] = "\\e5a9", + ["fa-toolbox"] = "\\f552", + ["fa-hands-holding-circle"] = "\\e4fb", + ["fa-bug"] = "\\f188", + ["fa-credit-card"] = "\\f09d", + ["fa-car"] = "\\f1b9", + ["fa-hand-holding-hand"] = "\\e4f7", + ["fa-book-reader"] = "\\f5da", + ["fa-mountain-sun"] = "\\e52f", + ["fa-arrows-left-right-to-line"] = "\\e4ba", + ["fa-dice-d20"] = "\\f6cf", + ["fa-truck-droplet"] = "\\e58c", + ["fa-file-circle-xmark"] = "\\e5a1", + ["fa-temperature-up"] = "\\e040", + ["fa-medal"] = "\\f5a2", + ["fa-bed"] = "\\f236", + ["fa-square-h"] = "\\f0fd", + ["fa-podcast"] = "\\f2ce", + ["fa-thermometer-full"] = "\\f2c7", + ["fa-bell"] = "\\f0f3", + ["fa-superscript"] = "\\f12b", + ["fa-plug-circle-xmark"] = "\\e560", + ["fa-star-of-life"] = "\\f621", + ["fa-phone-slash"] = "\\f3dd", + ["fa-paint-roller"] = "\\f5aa", + ["fa-handshake-angle"] = "\\f4c4", + ["fa-map-marker-alt"] = "\\f3c5", + ["fa-file"] = "\\f15b", + ["fa-greater-than"] = "\\3e", + ["fa-swimmer"] = "\\f5c4", + ["fa-arrow-down"] = "\\f063", + ["fa-tint"] = "\\f043", + ["fa-eraser"] = "\\f12d", + ["fa-globe-americas"] = "\\f57d", + ["fa-person-burst"] = "\\e53b", + ["fa-dove"] = "\\f4ba", + ["fa-battery-empty"] = "\\f244", + ["fa-socks"] = "\\f696", + ["fa-inbox"] = "\\f01c", + ["fa-section"] = "\\e447", + ["fa-tachometer-alt"] = "\\f625", + ["fa-envelope-open-text"] = "\\f658", + ["fa-hospital"] = "\\f0f8", + ["fa-wine-bottle"] = "\\f72f", + ["fa-chess-rook"] = "\\f447", + ["fa-stream"] = "\\f550", + ["fa-dharmachakra"] = "\\f655", + ["fa-hotdog"] = "\\f80f", + ["fa-person-walking-with-cane"] = "\\f29d", + ["fa-drum"] = "\\f569", + ["fa-ice-cream"] = "\\f810", + ["fa-heart-circle-bolt"] = "\\e4fc", + ["fa-fax"] = "\\f1ac", + ["fa-paragraph"] = "\\f1dd", + ["fa-vote-yea"] = "\\f772", + ["fa-star-half"] = "\\f089", + ["fa-boxes"] = "\\f468", + ["fa-link"] = "\\f0c1", + ["fa-ear-listen"] = "\\f2a2", + ["fa-tree-city"] = "\\e587", + ["fa-play"] = "\\f04b", + ["fa-font"] = "\\f031", + ["fa-table-cells-row-lock"] = "\\e67a", + ["fa-rupiah-sign"] = "\\e23d", + ["fa-search"] = "\\f002", + ["fa-table-tennis"] = "\\f45d", + ["fa-person-dots-from-line"] = "\\f470", + ["fa-trash-restore-alt"] = "\\f82a", + ["fa-naira-sign"] = "\\e1f6", + ["fa-cart-arrow-down"] = "\\f218", + ["fa-walkie-talkie"] = "\\f8ef", + ["fa-file-pen"] = "\\f31c", + ["fa-receipt"] = "\\f543", + ["fa-square-pen"] = "\\f14b", + ["fa-suitcase-rolling"] = "\\f5c1", + ["fa-person-circle-exclamation"] = "\\e53f", + ["fa-chevron-down"] = "\\f078", + ["fa-battery"] = "\\f240", + ["fa-skull-crossbones"] = "\\f714", + ["fa-code-compare"] = "\\e13a", + ["fa-list-ul"] = "\\f0ca", + ["fa-school-lock"] = "\\e56f", + ["fa-tower-cell"] = "\\e585", + ["fa-long-arrow-alt-down"] = "\\f309", + ["fa-ranking-star"] = "\\e561", + ["fa-chess-king"] = "\\f43f", + ["fa-person-harassing"] = "\\e549", + ["fa-brazilian-real-sign"] = "\\e46c", + ["fa-landmark-dome"] = "\\f752", + ["fa-arrow-up"] = "\\f062", + ["fa-tv"] = "\\f26c", + ["fa-shrimp"] = "\\e448", + ["fa-tasks"] = "\\f0ae", + ["fa-jug-detergent"] = "\\e519", + ["fa-user-circle"] = "\\f2bd", + ["fa-user-shield"] = "\\f505", + ["fa-wind"] = "\\f72e", + ["fa-car-crash"] = "\\f5e1", + ["fa-y"] = "\\59", + ["fa-snowboarding"] = "\\f7ce", + ["fa-truck-fast"] = "\\f48b", + ["fa-fish"] = "\\f578", + ["fa-user-graduate"] = "\\f501", + ["fa-circle-half-stroke"] = "\\f042", + ["fa-clapperboard"] = "\\e131", + ["fa-radiation-alt"] = "\\f7ba", + ["fa-baseball"] = "\\f433", + ["fa-jet-fighter-up"] = "\\e518", + ["fa-project-diagram"] = "\\f542", + ["fa-copy"] = "\\f0c5", + ["fa-volume-xmark"] = "\\f6a9", + ["fa-hand-sparkles"] = "\\e05d", + ["fa-grip"] = "\\f58d", + ["fa-share-square"] = "\\f14d", + ["fa-child-rifle"] = "\\e4e0", + ["fa-gun"] = "\\e19b", + ["fa-square-phone"] = "\\f098", + ["fa-plus"] = "\\2b", + ["fa-expand"] = "\\f065", + ["fa-computer"] = "\\e4e5", + ["fa-xmark"] = "\\f00d", + ["fa-arrows"] = "\\f047", + ["fa-chalkboard-user"] = "\\f51c", + ["fa-peso-sign"] = "\\e222", + ["fa-building-shield"] = "\\e4d8", + ["fa-baby"] = "\\f77c", + ["fa-users-line"] = "\\e592", + ["fa-quote-left"] = "\\f10d", + ["fa-tractor"] = "\\f722", + ["fa-trash-restore"] = "\\f829", + ["fa-arrow-down-up-lock"] = "\\e4b0", + ["fa-lines-leaning"] = "\\e51e", + ["fa-ruler-combined"] = "\\f546", + ["fa-copyright"] = "\\f1f9", + ["fa-equals"] = "\\3d", + ["fa-blender"] = "\\f517", + ["fa-teeth"] = "\\f62e", + ["fa-sheqel"] = "\\f20b", + ["fa-map"] = "\\f279", + ["fa-rocket"] = "\\f135", + ["fa-photo-video"] = "\\f87c", + ["fa-folder-minus"] = "\\f65d", + ["fa-store"] = "\\f54e", + ["fa-arrow-trend-up"] = "\\e098", + ["fa-plug-circle-minus"] = "\\e55e", + ["fa-sign"] = "\\f4d9", + ["fa-bezier-curve"] = "\\f55b", + ["fa-bell-slash"] = "\\f1f6", + ["fa-tablet"] = "\\f3fb", + ["fa-school-flag"] = "\\e56e", + ["fa-fill"] = "\\f575", + ["fa-angle-up"] = "\\f106", + ["fa-drumstick-bite"] = "\\f6d7", + ["fa-holly-berry"] = "\\f7aa", + ["fa-chevron-left"] = "\\f053", + ["fa-bacteria"] = "\\e059", + ["fa-hand-lizard"] = "\\f258", + ["fa-notdef"] = "\\e1fe", + ["fa-disease"] = "\\f7fa", + ["fa-briefcase-medical"] = "\\f469", + ["fa-genderless"] = "\\f22d", + ["fa-chevron-right"] = "\\f054", + ["fa-retweet"] = "\\f079", + ["fa-car-rear"] = "\\f5de", + ["fa-pump-soap"] = "\\e06b", + ["fa-video-slash"] = "\\f4e2", + ["fa-battery-quarter"] = "\\f243", + ["fa-radio"] = "\\f8d7", + ["fa-carriage-baby"] = "\\f77d", + ["fa-traffic-light"] = "\\f637", + ["fa-thermometer"] = "\\f491", + ["fa-vr-cardboard"] = "\\f729", + ["fa-hand-middle-finger"] = "\\f806", + ["fa-percentage"] = "\\25", + ["fa-truck-moving"] = "\\f4df", + ["fa-glass-water-droplet"] = "\\e4f5", + ["fa-display"] = "\\e163", + ["fa-smile"] = "\\f118", + ["fa-thumbtack"] = "\\f08d", + ["fa-trophy"] = "\\f091", + ["fa-pray"] = "\\f683", + ["fa-hammer"] = "\\f6e3", + ["fa-hand-peace"] = "\\f25b", + ["fa-sync-alt"] = "\\f2f1", + ["fa-spinner"] = "\\f110", + ["fa-robot"] = "\\f544", + ["fa-peace"] = "\\f67c", + ["fa-gears"] = "\\f085", + ["fa-warehouse"] = "\\f494", + ["fa-arrow-up-right-dots"] = "\\e4b7", + ["fa-splotch"] = "\\f5bc", + ["fa-grin-hearts"] = "\\f584", + ["fa-dice-four"] = "\\f524", + ["fa-sim-card"] = "\\f7c4", + ["fa-transgender"] = "\\f225", + ["fa-mercury"] = "\\f223", + ["fa-level-down"] = "\\f149", + ["fa-person-falling-burst"] = "\\e547", + ["fa-award"] = "\\f559", + ["fa-ticket-simple"] = "\\f3ff", + ["fa-building"] = "\\f1ad", + ["fa-angles-left"] = "\\f100", + ["fa-qrcode"] = "\\f029", + ["fa-history"] = "\\f1da", + ["fa-grin-beam-sweat"] = "\\f583", + ["fa-file-export"] = "\\f56e", + ["fa-shield"] = "\\f132", + ["fa-sort-amount-up-alt"] = "\\f885", + ["fa-house-medical"] = "\\e3b2", + ["fa-golf-ball"] = "\\f450", + ["fa-circle-chevron-left"] = "\\f137", + ["fa-house-chimney-window"] = "\\e00d", + ["fa-pen-nib"] = "\\f5ad", + ["fa-tent-arrow-turn-left"] = "\\e580", + ["fa-tents"] = "\\e582", + ["fa-wand-magic"] = "\\f0d0", + ["fa-dog"] = "\\f6d3", + ["fa-carrot"] = "\\f787", + ["fa-moon"] = "\\f186", + ["fa-wine-glass-empty"] = "\\f5ce", + ["fa-cheese"] = "\\f7ef", + ["fa-yin-yang"] = "\\f6ad", + ["fa-music"] = "\\f001", + ["fa-code-commit"] = "\\f386", + ["fa-temperature-low"] = "\\f76b", + ["fa-person-biking"] = "\\f84a", + ["fa-broom"] = "\\f51a", + ["fa-shield-heart"] = "\\e574", + ["fa-gopuram"] = "\\f664", + ["fa-globe-oceania"] = "\\e47b", + ["fa-xmark-square"] = "\\f2d3", + ["fa-hashtag"] = "\\23", + ["fa-up-right-and-down-left-from-center"] = "\\f424", + ["fa-oil-can"] = "\\f613", + ["fa-t"] = "\\54", + ["fa-hippo"] = "\\f6ed", + ["fa-chart-column"] = "\\e0e3", + ["fa-infinity"] = "\\f534", + ["fa-vial-circle-check"] = "\\e596", + ["fa-person-arrow-down-to-line"] = "\\e538", + ["fa-voicemail"] = "\\f897", + ["fa-fan"] = "\\f863", + ["fa-person-walking-luggage"] = "\\e554", + ["fa-up-down"] = "\\f338", + ["fa-cloud-moon-rain"] = "\\f73c", + ["fa-calendar"] = "\\f133", + ["fa-trailer"] = "\\e041", + ["fa-haykal"] = "\\f666", + ["fa-sd-card"] = "\\f7c2", + ["fa-dragon"] = "\\f6d5", + ["fa-shoe-prints"] = "\\f54b", + ["fa-plus-circle"] = "\\f055", + ["fa-grin-tongue-wink"] = "\\f58b", + ["fa-hand-holding"] = "\\f4bd", + ["fa-plug-circle-exclamation"] = "\\e55d", + ["fa-unlink"] = "\\f127", + ["fa-clone"] = "\\f24d", + ["fa-person-walking-arrow-loop-left"] = "\\e551", + ["fa-sort-alpha-up-alt"] = "\\f882", + ["fa-fire-flame-curved"] = "\\f7e4", + ["fa-tornado"] = "\\f76f", + ["fa-file-circle-plus"] = "\\e494", + ["fa-quran"] = "\\f687", + ["fa-anchor"] = "\\f13d", + ["fa-border-all"] = "\\f84c", + ["fa-face-angry"] = "\\f556", + ["fa-cookie-bite"] = "\\f564", + ["fa-arrow-trend-down"] = "\\e097", + ["fa-rss"] = "\\f09e", + ["fa-draw-polygon"] = "\\f5ee", + ["fa-scale-balanced"] = "\\f24e", + ["fa-tachometer"] = "\\f62a", + ["fa-shower"] = "\\f2cc", + ["fa-desktop"] = "\\f390", + ["fa-m"] = "\\4d", + ["fa-th-list"] = "\\f00b", + ["fa-sms"] = "\\f7cd", + ["fa-book"] = "\\f02d", + ["fa-user-plus"] = "\\f234", + ["fa-check"] = "\\f00c", + ["fa-battery-three-quarters"] = "\\f241", + ["fa-house-circle-check"] = "\\e509", + ["fa-angle-left"] = "\\f104", + ["fa-diagram-successor"] = "\\e47a", + ["fa-truck-arrow-right"] = "\\e58b", + ["fa-arrows-split-up-and-left"] = "\\e4bc", + ["fa-hand-fist"] = "\\f6de", + ["fa-cloud-moon"] = "\\f6c3", + ["fa-briefcase"] = "\\f0b1", + ["fa-person-falling"] = "\\e546", + ["fa-portrait"] = "\\f3e0", + ["fa-user-tag"] = "\\f507", + ["fa-rug"] = "\\e569", + ["fa-globe-europe"] = "\\f7a2", + ["fa-luggage-cart"] = "\\f59d", + ["fa-window-close"] = "\\f410", + ["fa-baht-sign"] = "\\e0ac", + ["fa-book-open"] = "\\f518", + ["fa-journal-whills"] = "\\f66a", + ["fa-handcuffs"] = "\\e4f8", + ["fa-warning"] = "\\f071", + ["fa-database"] = "\\f1c0", + ["fa-share"] = "\\f064", + ["fa-bottle-droplet"] = "\\e4c4", + ["fa-mask-face"] = "\\e1d7", + ["fa-hill-rockslide"] = "\\e508", + ["fa-right-left"] = "\\f362", + ["fa-paper-plane"] = "\\f1d8", + ["fa-road-circle-exclamation"] = "\\e565", + ["fa-dungeon"] = "\\f6d9", + ["fa-align-right"] = "\\f038", + ["fa-money-bill-wave-alt"] = "\\f53b", + ["fa-life-ring"] = "\\f1cd", + ["fa-signing"] = "\\f2a7", + ["fa-calendar-day"] = "\\f783", + ["fa-water-ladder"] = "\\f5c5", + ["fa-arrows-v"] = "\\f07d", + ["fa-grimace"] = "\\f57f", + ["fa-wheelchair-move"] = "\\e2ce", + ["fa-turn-down"] = "\\f3be", + ["fa-person-walking-arrow-right"] = "\\e552", + ["fa-square-envelope"] = "\\f199", + ["fa-dice"] = "\\f522", + ["fa-bowling-ball"] = "\\f436", + ["fa-brain"] = "\\f5dc", + ["fa-bandage"] = "\\f462", + ["fa-calendar-minus"] = "\\f272", + ["fa-xmark-circle"] = "\\f057", + ["fa-gifts"] = "\\f79c", + ["fa-hotel"] = "\\f594", + ["fa-globe-asia"] = "\\f57e", + ["fa-id-card-clip"] = "\\f47f", + ["fa-search-plus"] = "\\f00e", + ["fa-thumbs-up"] = "\\f164", + ["fa-user-clock"] = "\\f4fd", + ["fa-hand-dots"] = "\\f461", + ["fa-file-invoice"] = "\\f570", + ["fa-window-minimize"] = "\\f2d1", + ["fa-mug-saucer"] = "\\f0f4", + ["fa-brush"] = "\\f55d", + ["fa-mask"] = "\\f6fa", + ["fa-search-minus"] = "\\f010", + ["fa-ruler-vertical"] = "\\f548", + ["fa-user-large"] = "\\f406", + ["fa-train-tram"] = "\\e5b4", + ["fa-user-nurse"] = "\\f82f", + ["fa-syringe"] = "\\f48e", + ["fa-cloud-sun"] = "\\f6c4", + ["fa-stopwatch-20"] = "\\e06f", + ["fa-square-full"] = "\\f45c", + ["fa-magnet"] = "\\f076", + ["fa-jar"] = "\\e516", + ["fa-sticky-note"] = "\\f249", + ["fa-bug-slash"] = "\\e490", + ["fa-arrow-up-from-water-pump"] = "\\e4b6", + ["fa-bone"] = "\\f5d7", + ["fa-table-cells-row-unlock"] = "\\e691", + ["fa-user-injured"] = "\\f728", + ["fa-sad-tear"] = "\\f5b4", + ["fa-plane"] = "\\f072", + ["fa-tent-arrows-down"] = "\\e581", + ["fa-exclamation"] = "\\21", + ["fa-arrows-spin"] = "\\e4bb", + ["fa-print"] = "\\f02f", + ["fa-turkish-lira"] = "\\e2bb", + ["fa-usd"] = "\\24", + ["fa-x"] = "\\58", + ["fa-search-dollar"] = "\\f688", + ["fa-users-gear"] = "\\f509", + ["fa-person-military-pointing"] = "\\e54a", + ["fa-university"] = "\\f19c", + ["fa-umbrella"] = "\\f0e9", + ["fa-trowel"] = "\\e589", + ["fa-d"] = "\\44", + ["fa-stapler"] = "\\e5af", + ["fa-theater-masks"] = "\\f630", + ["fa-kip-sign"] = "\\e1c4", + ["fa-hand-point-left"] = "\\f0a5", + ["fa-handshake-simple"] = "\\f4c6", + ["fa-jet-fighter"] = "\\f0fb", + ["fa-square-share-nodes"] = "\\f1e1", + ["fa-barcode"] = "\\f02a", + ["fa-plus-minus"] = "\\e43c", + ["fa-video"] = "\\f03d", + ["fa-mortar-board"] = "\\f19d", + ["fa-hand-holding-medical"] = "\\e05c", + ["fa-person-circle-check"] = "\\e53e", + ["fa-turn-up"] = "\\f3bf", + ["fa-monero"] = "\\f3d0", + ["fa-hooli"] = "\\f427", + ["fa-yelp"] = "\\f1e9", + ["fa-cc-visa"] = "\\f1f0", + ["fa-lastfm"] = "\\f202", + ["fa-shopware"] = "\\f5b5", + ["fa-creative-commons-nc"] = "\\f4e8", + ["fa-aws"] = "\\f375", + ["fa-redhat"] = "\\f7bc", + ["fa-yoast"] = "\\f2b1", + ["fa-cloudflare"] = "\\e07d", + ["fa-ups"] = "\\f7e0", + ["fa-pixiv"] = "\\e640", + ["fa-wpexplorer"] = "\\f2de", + ["fa-dyalog"] = "\\f399", + ["fa-bity"] = "\\f37a", + ["fa-stackpath"] = "\\f842", + ["fa-buysellads"] = "\\f20d", + ["fa-first-order"] = "\\f2b0", + ["fa-modx"] = "\\f285", + ["fa-guilded"] = "\\e07e", + ["fa-vnv"] = "\\f40b", + ["fa-square-js"] = "\\f3b9", + ["fa-microsoft"] = "\\f3ca", + ["fa-qq"] = "\\f1d6", + ["fa-orcid"] = "\\f8d2", + ["fa-java"] = "\\f4e4", + ["fa-invision"] = "\\f7b0", + ["fa-creative-commons-pd-alt"] = "\\f4ed", + ["fa-centercode"] = "\\f380", + ["fa-glide-g"] = "\\f2a6", + ["fa-drupal"] = "\\f1a9", + ["fa-jxl"] = "\\e67b", + ["fa-dart-lang"] = "\\e693", + ["fa-hire-a-helper"] = "\\f3b0", + ["fa-creative-commons-by"] = "\\f4e7", + ["fa-unity"] = "\\e049", + ["fa-whmcs"] = "\\f40d", + ["fa-rocketchat"] = "\\f3e8", + ["fa-vk"] = "\\f189", + ["fa-untappd"] = "\\f405", + ["fa-mailchimp"] = "\\f59e", + ["fa-css3-alt"] = "\\f38b", + ["fa-square-reddit"] = "\\f1a2", + ["fa-vimeo-v"] = "\\f27d", + ["fa-contao"] = "\\f26d", + ["fa-square-font-awesome"] = "\\e5ad", + ["fa-deskpro"] = "\\f38f", + ["fa-brave"] = "\\e63c", + ["fa-sistrix"] = "\\f3ee", + ["fa-square-instagram"] = "\\e055", + ["fa-battle-net"] = "\\f835", + ["fa-the-red-yeti"] = "\\f69d", + ["fa-square-hacker-news"] = "\\f3af", + ["fa-edge"] = "\\f282", + ["fa-threads"] = "\\e618", + ["fa-napster"] = "\\f3d2", + ["fa-square-snapchat"] = "\\f2ad", + ["fa-google-plus-g"] = "\\f0d5", + ["fa-artstation"] = "\\f77a", + ["fa-markdown"] = "\\f60f", + ["fa-sourcetree"] = "\\f7d3", + ["fa-google-plus"] = "\\f2b3", + ["fa-diaspora"] = "\\f791", + ["fa-foursquare"] = "\\f180", + ["fa-stack-overflow"] = "\\f16c", + ["fa-github-alt"] = "\\f113", + ["fa-phoenix-squadron"] = "\\f511", + ["fa-pagelines"] = "\\f18c", + ["fa-algolia"] = "\\f36c", + ["fa-red-river"] = "\\f3e3", + ["fa-creative-commons-sa"] = "\\f4ef", + ["fa-safari"] = "\\f267", + ["fa-google"] = "\\f1a0", + ["fa-square-font-awesome-stroke"] = "\\f35c", + ["fa-atlassian"] = "\\f77b", + ["fa-linkedin-in"] = "\\f0e1", + ["fa-digital-ocean"] = "\\f391", + ["fa-nimblr"] = "\\f5a8", + ["fa-chromecast"] = "\\f838", + ["fa-evernote"] = "\\f839", + ["fa-hacker-news"] = "\\f1d4", + ["fa-creative-commons-sampling"] = "\\f4f0", + ["fa-adversal"] = "\\f36a", + ["fa-creative-commons"] = "\\f25e", + ["fa-watchman-monitoring"] = "\\e087", + ["fa-fonticons"] = "\\f280", + ["fa-weixin"] = "\\f1d7", + ["fa-shirtsinbulk"] = "\\f214", + ["fa-codepen"] = "\\f1cb", + ["fa-git-alt"] = "\\f841", + ["fa-lyft"] = "\\f3c3", + ["fa-rev"] = "\\f5b2", + ["fa-windows"] = "\\f17a", + ["fa-wizards-of-the-coast"] = "\\f730", + ["fa-viadeo-square"] = "\\f2aa", + ["fa-meetup"] = "\\f2e0", + ["fa-centos"] = "\\f789", + ["fa-adn"] = "\\f170", + ["fa-cloudsmith"] = "\\f384", + ["fa-opensuse"] = "\\e62b", + ["fa-pied-piper-alt"] = "\\f1a8", + ["fa-square-dribbble"] = "\\f397", + ["fa-codiepie"] = "\\f284", + ["fa-node"] = "\\f419", + ["fa-mix"] = "\\f3cb", + ["fa-steam"] = "\\f1b6", + ["fa-cc-apple-pay"] = "\\f416", + ["fa-scribd"] = "\\f28a", + ["fa-debian"] = "\\e60b", + ["fa-openid"] = "\\f19b", + ["fa-instalod"] = "\\e081", + ["fa-expeditedssl"] = "\\f23e", + ["fa-sellcast"] = "\\f2da", + ["fa-twitter-square"] = "\\f081", + ["fa-r-project"] = "\\f4f7", + ["fa-delicious"] = "\\f1a5", + ["fa-freebsd"] = "\\f3a4", + ["fa-vuejs"] = "\\f41f", + ["fa-accusoft"] = "\\f369", + ["fa-ioxhost"] = "\\f208", + ["fa-fonticons-fi"] = "\\f3a2", + ["fa-app-store"] = "\\f36f", + ["fa-cc-mastercard"] = "\\f1f1", + ["fa-itunes-note"] = "\\f3b5", + ["fa-golang"] = "\\e40f", + ["fa-square-kickstarter"] = "\\f3bb", + ["fa-grav"] = "\\f2d6", + ["fa-weibo"] = "\\f18a", + ["fa-uncharted"] = "\\e084", + ["fa-firstdraft"] = "\\f3a1", + ["fa-youtube-square"] = "\\f431", + ["fa-wikipedia-w"] = "\\f266", + ["fa-wpressr"] = "\\f3e4", + ["fa-angellist"] = "\\f209", + ["fa-galactic-republic"] = "\\f50c", + ["fa-nfc-directional"] = "\\e530", + ["fa-skype"] = "\\f17e", + ["fa-joget"] = "\\f3b7", + ["fa-fedora"] = "\\f798", + ["fa-stripe-s"] = "\\f42a", + ["fa-meta"] = "\\e49b", + ["fa-laravel"] = "\\f3bd", + ["fa-hotjar"] = "\\f3b1", + ["fa-bluetooth-b"] = "\\f294", + ["fa-square-letterboxd"] = "\\e62e", + ["fa-sticker-mule"] = "\\f3f7", + ["fa-creative-commons-zero"] = "\\f4f3", + ["fa-hips"] = "\\f452", + ["fa-behance"] = "\\f1b4", + ["fa-reddit"] = "\\f1a1", + ["fa-discord"] = "\\f392", + ["fa-chrome"] = "\\f268", + ["fa-app-store-ios"] = "\\f370", + ["fa-cc-discover"] = "\\f1f2", + ["fa-wpbeginner"] = "\\f297", + ["fa-confluence"] = "\\f78d", + ["fa-shoelace"] = "\\e60c", + ["fa-mdb"] = "\\f8ca", + ["fa-dochub"] = "\\f394", + ["fa-accessible-icon"] = "\\f368", + ["fa-ebay"] = "\\f4f4", + ["fa-amazon"] = "\\f270", + ["fa-unsplash"] = "\\e07c", + ["fa-yarn"] = "\\f7e3", + ["fa-steam-square"] = "\\f1b7", + ["fa-500px"] = "\\f26e", + ["fa-vimeo-square"] = "\\f194", + ["fa-asymmetrik"] = "\\f372", + ["fa-font-awesome"] = "\\f2b4", + ["fa-gratipay"] = "\\f184", + ["fa-apple"] = "\\f179", + ["fa-hive"] = "\\e07f", + ["fa-gitkraken"] = "\\f3a6", + ["fa-keybase"] = "\\f4f5", + ["fa-apple-pay"] = "\\f415", + ["fa-padlet"] = "\\e4a0", + ["fa-amazon-pay"] = "\\f42c", + ["fa-square-github"] = "\\f092", + ["fa-stumbleupon"] = "\\f1a4", + ["fa-fedex"] = "\\f797", + ["fa-phoenix-framework"] = "\\f3dc", + ["fa-shopify"] = "\\e057", + ["fa-neos"] = "\\f612", + ["fa-square-threads"] = "\\e619", + ["fa-hackerrank"] = "\\f5f7", + ["fa-researchgate"] = "\\f4f8", + ["fa-swift"] = "\\f8e1", + ["fa-angular"] = "\\f420", + ["fa-speakap"] = "\\f3f3", + ["fa-angrycreative"] = "\\f36e", + ["fa-y-combinator"] = "\\f23b", + ["fa-empire"] = "\\f1d1", + ["fa-envira"] = "\\f299", + ["fa-google-scholar"] = "\\e63b", + ["fa-square-gitlab"] = "\\e5ae", + ["fa-studiovinari"] = "\\f3f8", + ["fa-pied-piper"] = "\\f2ae", + ["fa-wordpress"] = "\\f19a", + ["fa-product-hunt"] = "\\f288", + ["fa-firefox"] = "\\f269", + ["fa-linode"] = "\\f2b8", + ["fa-goodreads"] = "\\f3a8", + ["fa-square-odnoklassniki"] = "\\f264", + ["fa-jsfiddle"] = "\\f1cc", + ["fa-sith"] = "\\f512", + ["fa-themeisle"] = "\\f2b2", + ["fa-page4"] = "\\f3d7", + ["fa-hashnode"] = "\\e499", + ["fa-react"] = "\\f41b", + ["fa-cc-paypal"] = "\\f1f4", + ["fa-squarespace"] = "\\f5be", + ["fa-cc-stripe"] = "\\f1f5", + ["fa-creative-commons-share"] = "\\f4f2", + ["fa-bitcoin"] = "\\f379", + ["fa-keycdn"] = "\\f3ba", + ["fa-opera"] = "\\f26a", + ["fa-itch-io"] = "\\f83a", + ["fa-umbraco"] = "\\f8e8", + ["fa-galactic-senate"] = "\\f50d", + ["fa-ubuntu"] = "\\f7df", + ["fa-draft2digital"] = "\\f396", + ["fa-stripe"] = "\\f429", + ["fa-houzz"] = "\\f27c", + ["fa-gg"] = "\\f260", + ["fa-dhl"] = "\\f790", + ["fa-square-pinterest"] = "\\f0d3", + ["fa-xing"] = "\\f168", + ["fa-blackberry"] = "\\f37b", + ["fa-creative-commons-pd"] = "\\f4ec", + ["fa-playstation"] = "\\f3df", + ["fa-quinscape"] = "\\f459", + ["fa-less"] = "\\f41d", + ["fa-blogger-b"] = "\\f37d", + ["fa-opencart"] = "\\f23d", + ["fa-vine"] = "\\f1ca", + ["fa-signal-messenger"] = "\\e663", + ["fa-paypal"] = "\\f1ed", + ["fa-gitlab"] = "\\f296", + ["fa-typo3"] = "\\f42b", + ["fa-reddit-alien"] = "\\f281", + ["fa-yahoo"] = "\\f19e", + ["fa-dailymotion"] = "\\e052", + ["fa-affiliatetheme"] = "\\f36b", + ["fa-pied-piper-pp"] = "\\f1a7", + ["fa-bootstrap"] = "\\f836", + ["fa-odnoklassniki"] = "\\f263", + ["fa-nfc-symbol"] = "\\e531", + ["fa-mintbit"] = "\\e62f", + ["fa-ethereum"] = "\\f42e", + ["fa-speaker-deck"] = "\\f83c", + ["fa-creative-commons-nc-eu"] = "\\f4e9", + ["fa-patreon"] = "\\f3d9", + ["fa-avianex"] = "\\f374", + ["fa-ello"] = "\\f5f1", + ["fa-gofore"] = "\\f3a7", + ["fa-bimobject"] = "\\f378", + ["fa-brave-reverse"] = "\\e63d", + ["fa-facebook-f"] = "\\f39e", + ["fa-square-google-plus"] = "\\f0d4", + ["fa-web-awesome"] = "\\e682", + ["fa-mandalorian"] = "\\f50f", + ["fa-first-order-alt"] = "\\f50a", + ["fa-osi"] = "\\f41a", + ["fa-google-wallet"] = "\\f1ee", + ["fa-d-and-d-beyond"] = "\\f6ca", + ["fa-periscope"] = "\\f3da", + ["fa-fulcrum"] = "\\f50b", + ["fa-cloudscale"] = "\\f383", + ["fa-forumbee"] = "\\f211", + ["fa-mizuni"] = "\\f3cc", + ["fa-schlix"] = "\\f3ea", + ["fa-xing-square"] = "\\f169", + ["fa-bandcamp"] = "\\f2d5", + ["fa-wpforms"] = "\\f298", + ["fa-cloudversify"] = "\\f385", + ["fa-usps"] = "\\f7e1", + ["fa-megaport"] = "\\f5a3", + ["fa-magento"] = "\\f3c4", + ["fa-spotify"] = "\\f1bc", + ["fa-optin-monster"] = "\\f23c", + ["fa-fly"] = "\\f417", + ["fa-aviato"] = "\\f421", + ["fa-itunes"] = "\\f3b4", + ["fa-cuttlefish"] = "\\f38c", + ["fa-blogger"] = "\\f37c", + ["fa-flickr"] = "\\f16e", + ["fa-viber"] = "\\f409", + ["fa-soundcloud"] = "\\f1be", + ["fa-digg"] = "\\f1a6", + ["fa-tencent-weibo"] = "\\f1d5", + ["fa-letterboxd"] = "\\e62d", + ["fa-symfony"] = "\\f83d", + ["fa-maxcdn"] = "\\f136", + ["fa-etsy"] = "\\f2d7", + ["fa-facebook-messenger"] = "\\f39f", + ["fa-audible"] = "\\f373", + ["fa-think-peaks"] = "\\f731", + ["fa-bilibili"] = "\\e3d9", + ["fa-erlang"] = "\\f39d", + ["fa-x-twitter"] = "\\e61b", + ["fa-cotton-bureau"] = "\\f89e", + ["fa-dashcube"] = "\\f210", + ["fa-innosoft"] = "\\e080", + ["fa-stack-exchange"] = "\\f18d", + ["fa-elementor"] = "\\f430", + ["fa-square-pied-piper"] = "\\e01e", + ["fa-creative-commons-nd"] = "\\f4eb", + ["fa-palfed"] = "\\f3d8", + ["fa-superpowers"] = "\\f2dd", + ["fa-resolving"] = "\\f3e7", + ["fa-xbox"] = "\\f412", + ["fa-square-web-awesome-stroke"] = "\\e684", + ["fa-searchengin"] = "\\f3eb", + ["fa-tiktok"] = "\\e07b", + ["fa-square-facebook"] = "\\f082", + ["fa-renren"] = "\\f18b", + ["fa-linux"] = "\\f17c", + ["fa-glide"] = "\\f2a5", + ["fa-linkedin"] = "\\f08c", + ["fa-hubspot"] = "\\f3b2", + ["fa-deploydog"] = "\\f38e", + ["fa-twitch"] = "\\f1e8", + ["fa-flutter"] = "\\e694", + ["fa-ravelry"] = "\\f2d9", + ["fa-mixer"] = "\\e056", + ["fa-square-lastfm"] = "\\f203", + ["fa-vimeo"] = "\\f40a", + ["fa-mendeley"] = "\\f7b3", + ["fa-uniregistry"] = "\\f404", + ["fa-figma"] = "\\f799", + ["fa-creative-commons-remix"] = "\\f4ee", + ["fa-cc-amazon-pay"] = "\\f42d", + ["fa-dropbox"] = "\\f16b", + ["fa-instagram"] = "\\f16d", + ["fa-cmplid"] = "\\e360", + ["fa-upwork"] = "\\e641", + ["fa-facebook"] = "\\f09a", + ["fa-gripfire"] = "\\f3ac", + ["fa-jedi-order"] = "\\f50e", + ["fa-uikit"] = "\\f403", + ["fa-fort-awesome-alt"] = "\\f3a3", + ["fa-phabricator"] = "\\f3db", + ["fa-ussunnah"] = "\\f407", + ["fa-earlybirds"] = "\\f39a", + ["fa-trade-federation"] = "\\f513", + ["fa-autoprefixer"] = "\\f41c", + ["fa-whatsapp"] = "\\f232", + ["fa-square-upwork"] = "\\e67c", + ["fa-slideshare"] = "\\f1e7", + ["fa-google-play"] = "\\f3ab", + ["fa-viadeo"] = "\\f2a9", + ["fa-line"] = "\\f3c0", + ["fa-google-drive"] = "\\f3aa", + ["fa-servicestack"] = "\\f3ec", + ["fa-simplybuilt"] = "\\f215", + ["fa-bitbucket"] = "\\f171", + ["fa-imdb"] = "\\f2d8", + ["fa-deezer"] = "\\e077", + ["fa-raspberry-pi"] = "\\f7bb", + ["fa-jira"] = "\\f7b1", + ["fa-docker"] = "\\f395", + ["fa-screenpal"] = "\\e570", + ["fa-bluetooth"] = "\\f293", + ["fa-gitter"] = "\\f426", + ["fa-d-and-d"] = "\\f38d", + ["fa-microblog"] = "\\e01a", + ["fa-cc-diners-club"] = "\\f24c", + ["fa-gg-circle"] = "\\f261", + ["fa-pied-piper-hat"] = "\\f4e5", + ["fa-kickstarter-k"] = "\\f3bc", + ["fa-yandex"] = "\\f413", + ["fa-readme"] = "\\f4d5", + ["fa-html5"] = "\\f13b", + ["fa-sellsy"] = "\\f213", + ["fa-square-web-awesome"] = "\\e683", + ["fa-sass"] = "\\f41e", + ["fa-wsh"] = "\\e2d0", + ["fa-buromobelexperte"] = "\\f37f", + ["fa-salesforce"] = "\\f83b", + ["fa-octopus-deploy"] = "\\e082", + ["fa-medapps"] = "\\f3c6", + ["fa-ns8"] = "\\f3d5", + ["fa-pinterest-p"] = "\\f231", + ["fa-apper"] = "\\f371", + ["fa-fort-awesome"] = "\\f286", + ["fa-waze"] = "\\f83f", + ["fa-bluesky"] = "\\e671", + ["fa-cc-jcb"] = "\\f24b", + ["fa-snapchat"] = "\\f2ab", + ["fa-fantasy-flight-games"] = "\\f6dc", + ["fa-rust"] = "\\e07a", + ["fa-wix"] = "\\f5cf", + ["fa-square-behance"] = "\\f1b5", + ["fa-supple"] = "\\f3f9", + ["fa-webflow"] = "\\e65c", + ["fa-rebel"] = "\\f1d0", + ["fa-css3"] = "\\f13c", + ["fa-staylinked"] = "\\f3f5", + ["fa-kaggle"] = "\\f5fa", + ["fa-space-awesome"] = "\\e5ac", + ["fa-deviantart"] = "\\f1bd", + ["fa-cpanel"] = "\\f388", + ["fa-goodreads-g"] = "\\f3a9", + ["fa-square-git"] = "\\f1d2", + ["fa-tumblr-square"] = "\\f174", + ["fa-trello"] = "\\f181", + ["fa-creative-commons-nc-jp"] = "\\f4ea", + ["fa-get-pocket"] = "\\f265", + ["fa-perbyte"] = "\\e083", + ["fa-grunt"] = "\\f3ad", + ["fa-weebly"] = "\\f5cc", + ["fa-connectdevelop"] = "\\f20e", + ["fa-leanpub"] = "\\f212", + ["fa-black-tie"] = "\\f27e", + ["fa-themeco"] = "\\f5c6", + ["fa-python"] = "\\f3e2", + ["fa-android"] = "\\f17b", + ["fa-bots"] = "\\e340", + ["fa-free-code-camp"] = "\\f2c5", + ["fa-hornbill"] = "\\f592", + ["fa-js"] = "\\f3b8", + ["fa-ideal"] = "\\e013", + ["fa-git"] = "\\f1d3", + ["fa-dev"] = "\\f6cc", + ["fa-sketch"] = "\\f7c6", + ["fa-yandex-international"] = "\\f414", + ["fa-cc-amex"] = "\\f1f3", + ["fa-uber"] = "\\f402", + ["fa-github"] = "\\f09b", + ["fa-php"] = "\\f457", + ["fa-alipay"] = "\\f642", + ["fa-youtube"] = "\\f167", + ["fa-skyatlas"] = "\\f216", + ["fa-firefox-browser"] = "\\e007", + ["fa-replyd"] = "\\f3e6", + ["fa-suse"] = "\\f7d6", + ["fa-jenkins"] = "\\f3b6", + ["fa-twitter"] = "\\f099", + ["fa-rockrms"] = "\\f3e9", + ["fa-pinterest"] = "\\f0d2", + ["fa-buffer"] = "\\f837", + ["fa-npm"] = "\\f3d4", + ["fa-yammer"] = "\\f840", + ["fa-btc"] = "\\f15a", + ["fa-dribbble"] = "\\f17d", + ["fa-stumbleupon-circle"] = "\\f1a3", + ["fa-internet-explorer"] = "\\f26b", + ["fa-stubber"] = "\\e5c7", + ["fa-telegram"] = "\\f2c6", + ["fa-old-republic"] = "\\f510", + ["fa-odysee"] = "\\e5c6", + ["fa-whatsapp-square"] = "\\f40c", + ["fa-node-js"] = "\\f3d3", + ["fa-edge-legacy"] = "\\e078", + ["fa-slack"] = "\\f198", + ["fa-medrt"] = "\\f3c8", + ["fa-usb"] = "\\f287", + ["fa-tumblr"] = "\\f173", + ["fa-vaadin"] = "\\f408", + ["fa-quora"] = "\\f2c4", + ["fa-square-x-twitter"] = "\\e61a", + ["fa-reacteurope"] = "\\f75d", + ["fa-medium"] = "\\f23a", + ["fa-amilia"] = "\\f36d", + ["fa-mixcloud"] = "\\f289", + ["fa-flipboard"] = "\\f44d", + ["fa-viacoin"] = "\\f237", + ["fa-critical-role"] = "\\f6c9", + ["fa-sitrox"] = "\\e44a", + ["fa-discourse"] = "\\f393", + ["fa-joomla"] = "\\f1aa", + ["fa-mastodon"] = "\\f4f6", + ["fa-airbnb"] = "\\f834", + ["fa-wolf-pack-battalion"] = "\\f514", + ["fa-buy-n-large"] = "\\f8a6", + ["fa-gulp"] = "\\f3ae", + ["fa-creative-commons-sampling-plus"] = "\\f4f1", + ["fa-strava"] = "\\f428", + ["fa-ember"] = "\\f423", + ["fa-canadian-maple-leaf"] = "\\f785", + ["fa-teamspeak"] = "\\f4f9", + ["fa-pushed"] = "\\f3e1", + ["fa-wordpress-simple"] = "\\f411", + ["fa-nutritionix"] = "\\f3d6", + ["fa-wodu"] = "\\e088", + ["fa-google-pay"] = "\\e079", + ["fa-intercom"] = "\\f7af", + ["fa-zhihu"] = "\\f63f", + ["fa-korvue"] = "\\f42f", + ["fa-pix"] = "\\e43a", + ["fa-steam-symbol"] = "\\f3f6", +} + +-- Function to get Unicode value for a FontAwesome icon name +local function fa_unicode(icon_name) + return fa_icons[icon_name] or nil +end + +return { + fa_unicode = fa_unicode +} diff --git a/Documentation/_quarto.yml b/Documentation/_quarto.yml index 66e85ca..b6107c8 100644 --- a/Documentation/_quarto.yml +++ b/Documentation/_quarto.yml @@ -17,6 +17,13 @@ metadata-files: website: title: "DeToX" + + announcement: + icon: exclamation-triangle + dismissable: true + content: "**Development Version** - DeToX is currently in beta. Features may change without notice. Thoroughly test before using in production studies." + type: danger + position: below-navbar cookie-consent: type: implied @@ -25,7 +32,7 @@ website: navbar: - logo: resources/full_logo.png + logo: resources/Logosvg.png right: - text: "Vignettes" @@ -34,20 +41,18 @@ website: href: Vignettes/Installation.qmd - text: Getting Started href: Vignettes/GettingStarted.qmd - + - text: Calibration + href: Vignettes/Calibration.qmd - href: api/index.qmd text: Reference tools: - icon: twitter - href: https://twitter.com + href: https://bsky.app/profile/devstart.org - icon: github - menu: - - text: Source Code - href: https://code.com - - text: Report a Bug - href: https://bugs.com + href: https://github.com/DevStart-Hub/DeToX + sidebar: - title: "Vignettes" @@ -57,6 +62,9 @@ website: href: Vignettes/Installation.qmd - text: Getting Started href: Vignettes/GettingStarted.qmd + - text: Calibration + href: Vignettes/Calibration.qmd + # Utilities @@ -99,12 +107,20 @@ format: code-block-background: true code-block-border-left: "#00B3B3" - # # Pagination - # grid: - # sidebar-width: 300px - # body-width: 1100px - # margin-width: 300px - # gutter-width: 1.5rem + # Pagination + grid: + sidebar-width: 300px + body-width: 1100px + margin-width: 300px + gutter-width: 1.5rem + +custom-callout: + Advanced: + color: "pink" + collapse: true +filters: +- custom-callout + quartodoc: style: pkgdown @@ -196,6 +212,6 @@ quartodoc: (e.g., ETSettings.animation) for easy configuration of your experiments. contents: - ETSettings.AnimationSettings + - ETSettings.CalibrationPatterns - ETSettings.CalibrationColors - ETSettings.UIElementSizes - - ETSettings.FontSizeMultipliers diff --git a/Documentation/api/BaseCalibrationSession.qmd b/Documentation/api/BaseCalibrationSession.qmd index 4d7bc94..3e464c3 100644 --- a/Documentation/api/BaseCalibrationSession.qmd +++ b/Documentation/api/BaseCalibrationSession.qmd @@ -4,9 +4,9 @@ BaseCalibrationSession( win, infant_stims, - shuffle=True, audio=None, anim_type='zoom', + visualization_style='lines', ) ``` @@ -62,19 +62,13 @@ BaseCalibrationSession.show_message_and_wait(body, title='', pos=(0, -0.15)) Display a message on screen and in console, then wait for keypress. Shows formatted message both in the PsychoPy window and console output, -then pauses execution until any key is pressed. Useful for instructions -and status messages during calibration. +enforces a minimum display time for readability and system stabilization, +then pauses execution until any key is pressed. #### Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------|--------|------------------------------------------------------------------------------------------------------------------------|--------------| -| body | str | The main message text to display. Will be formatted with box-drawing characters via NicePrint. | _required_ | -| title | str | Title for the message box. Appears at the top of the formatted box. Default empty string. | `''` | -| pos | tuple | Position of the message box center on screen in window units. Default (0, -0.15) places message slightly below center. | `(0, -0.15)` | - -#### Returns {.doc-section .doc-section-returns} - -| Name | Type | Description | -|--------|--------|---------------| -| | None | | \ No newline at end of file +| Name | Type | Description | Default | +|--------|--------|-------------------------------------------------------------------|--------------| +| body | str | The main message text to display. | _required_ | +| title | str | Title for the message box. Default empty string. | `''` | +| pos | tuple | Position of the message box center on screen. Default (0, -0.15). | `(0, -0.15)` | \ No newline at end of file diff --git a/Documentation/api/ETSettings.AnimationSettings.qmd b/Documentation/api/ETSettings.AnimationSettings.qmd index c1c4176..ad4d916 100644 --- a/Documentation/api/ETSettings.AnimationSettings.qmd +++ b/Documentation/api/ETSettings.AnimationSettings.qmd @@ -4,9 +4,9 @@ ETSettings.AnimationSettings( focus_time=0.5, zoom_speed=6.0, - max_zoom_size=0.11, + max_zoom_size=0.16, min_zoom_size=0.05, - trill_size=0.075, + trill_size=0.14, trill_rotation_range=20, trill_cycle_duration=1.5, trill_active_duration=1.1, diff --git a/Documentation/api/ETSettings.CalibrationColors.qmd b/Documentation/api/ETSettings.CalibrationColors.qmd index 879f115..4d8527b 100644 --- a/Documentation/api/ETSettings.CalibrationColors.qmd +++ b/Documentation/api/ETSettings.CalibrationColors.qmd @@ -2,8 +2,8 @@ ```python ETSettings.CalibrationColors( - left_eye=(0, 255, 0, 255), - right_eye=(255, 0, 0, 255), + left_eye=(100, 200, 255, 120), + right_eye=(255, 100, 120, 120), mouse=(255, 128, 0, 255), target_outline=(24, 24, 24, 255), highlight=(255, 255, 0, 255), diff --git a/Documentation/api/ETSettings.CalibrationPatterns.qmd b/Documentation/api/ETSettings.CalibrationPatterns.qmd new file mode 100644 index 0000000..ee8dd4e --- /dev/null +++ b/Documentation/api/ETSettings.CalibrationPatterns.qmd @@ -0,0 +1,37 @@ +# ETSettings.CalibrationPatterns { #DeToX.ETSettings.CalibrationPatterns } + +```python +ETSettings.CalibrationPatterns( + points_5=(lambda: [(0.0, 0.0), (-0.8, 0.8), (0.8, 0.8), (-0.8, -0.8), (0.8, -0.8)])(), + points_9=(lambda: [(-0.8, 0.8), (0.0, 0.8), (0.8, 0.8), (-0.8, 0.0), (0.0, 0.0), (0.8, 0.0), (-0.8, -0.8), (0.0, -0.8), (0.8, -0.8)])(), + num_samples_mouse=5, +) +``` + +Standard calibration point patterns in normalized coordinates. + +Defines commonly used calibration patterns in normalized units where +the screen ranges from -1 to +1 in both dimensions. These universal +coordinates work across different screen sizes, aspect ratios, and +PsychoPy unit systems. + +Convert to window-specific coordinates at runtime using the +norm_to_window_units() function from the Coords module. + +## Attributes {.doc-section .doc-section-attributes} + +| Name | Type | Description | +|-------------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| points_5 | list of tuple | 5-point calibration pattern (4 corners + center). Standard for quick calibrations with good coverage. Pattern: corners at 0.4 from edges to avoid screen boundaries. | +| points_9 | list of tuple | 9-point calibration pattern (33 grid). Standard for comprehensive calibrations requiring high accuracy. Pattern: 3 rows 3 columns with 0.4 positioning. | +| num_samples_mouse | int | Number of mouse position samples to collect per calibration point in simulation mode. Default 5. | + +## Examples {.doc-section .doc-section-examples} + +```python +>>> from DeToX import ETSettings as cfg +>>> from DeToX.Coords import norm_to_window_units +>>> +>>> # Change number of mouse samples collected per point +>>> cfg.calibration.num_samples_mouse = 10 +``` \ No newline at end of file diff --git a/Documentation/api/ETSettings.FontSizeMultipliers.qmd b/Documentation/api/ETSettings.FontSizeMultipliers.qmd deleted file mode 100644 index 1228e4d..0000000 --- a/Documentation/api/ETSettings.FontSizeMultipliers.qmd +++ /dev/null @@ -1,35 +0,0 @@ -# ETSettings.FontSizeMultipliers { #DeToX.ETSettings.FontSizeMultipliers } - -```python -ETSettings.FontSizeMultipliers( - instruction_text=1.5, - message_text=1.3, - title_text=1.4, -) -``` - -Font size multipliers for different text types. - -Defines scaling factors applied to the base text size (from UIElementSizes) -for different types of text displays in the calibration interface. - -## Attributes {.doc-section .doc-section-attributes} - -| Name | Type | Description | -|------------------|--------|--------------------------------------------------------------------------------------------------------| -| instruction_text | float | Multiplier for instruction text displayed during calibration. Default is 1.5 (150% of base text size). | -| message_text | float | Multiplier for general message text. Default is 1.3 (130% of base text size). | -| title_text | float | Multiplier for title text in message boxes. Default is 1.4 (140% of base text size). | - -## Notes {.doc-section .doc-section-notes} - -The final text size is calculated as: base_text_size * multiplier -where base_text_size comes from UIElementSizes.text. - -## Examples {.doc-section .doc-section-examples} - -```python ->>> font_sizes = FontSizeMultipliers() ->>> font_sizes.instruction_text = 2.0 # Larger instructions ->>> font_sizes.title_text = 1.8 # Larger titles -``` \ No newline at end of file diff --git a/Documentation/api/ETSettings.UIElementSizes.qmd b/Documentation/api/ETSettings.UIElementSizes.qmd index 31bd42c..c20fe8c 100644 --- a/Documentation/api/ETSettings.UIElementSizes.qmd +++ b/Documentation/api/ETSettings.UIElementSizes.qmd @@ -2,14 +2,19 @@ ```python ETSettings.UIElementSizes( - highlight=0.04, + highlight=0.02, line_width=0.003, marker=0.02, border=0.005, plot_line=0.002, text=0.025, target_circle=0.012, - target_circle_width=0.006, + target_circle_width=0.003, + sample_marker=0.005, + instruction_text=0.019, + message_text=0.016, + title_text=0.018, + legend_text=0.015, ) ``` @@ -24,14 +29,19 @@ PsychoPy window configuration. | Name | Type | Description | |---------------------|--------|---------------------------------------------------------------------------------------------------------------------| -| highlight | float | Radius of circles highlighting selected calibration points for retry. Default is 0.04 (4% of screen height). | +| highlight | float | Radius of circles highlighting selected calibration points for retry. Default is 0.02 (2% of screen height). | | line_width | float | Thickness of lines drawn in calibration visualizations. Default is 0.003 (0.3% of screen height). | | marker | float | Size of markers indicating data collection points. Default is 0.02 (2% of screen height). | | border | float | Thickness of the red calibration mode border around the screen. Default is 0.005 (0.5% of screen height). | | plot_line | float | Width of lines in calibration result plots connecting targets to samples. Default is 0.002 (0.2% of screen height). | -| text | float | Base text height for all text displays in the calibration interface. Default is 0.025 (2.5% of screen height). | +| text | float | Base text height (deprecated - use specific text sizes below). Default is 0.025 (2.5% of screen height). | | target_circle | float | Radius of target circles drawn in calibration result visualizations. Default is 0.012 (1.2% of screen height). | -| target_circle_width | float | Line width for target circle outlines in result visualizations. Default is 0.006 (0.6% of screen height). | +| target_circle_width | float | Line width for target circle outlines in result visualizations. Default is 0.003 (0.3% of screen height). | +| sample_marker | float | Radius of sample markers in circle visualization style. Default is 0.005 (0.5% of screen height). | +| instruction_text | float | Text height for instruction displays during calibration. Default is 0.019 (1.9% of screen height). | +| message_text | float | Text height for general message displays. Default is 0.016 (1.6% of screen height). | +| title_text | float | Text height for title text in message boxes. Default is 0.018 (1.8% of screen height). | +| legend_text | float | Text height for legend labels showing eye color coding. Default is 0.015 (1.5% of screen height). | ## Notes {.doc-section .doc-section-notes} @@ -44,5 +54,5 @@ units is handled automatically by the coordinate conversion functions. ```python >>> ui_sizes = UIElementSizes() >>> ui_sizes.highlight = 0.06 # Larger highlight circles ->>> ui_sizes.text = 0.035 # Larger text +>>> ui_sizes.instruction_text = 0.025 # Larger instructions ``` \ No newline at end of file diff --git a/Documentation/api/ETracker.calibrate.qmd b/Documentation/api/ETracker.calibrate.qmd index e53430d..ec84dce 100644 --- a/Documentation/api/ETracker.calibrate.qmd +++ b/Documentation/api/ETracker.calibrate.qmd @@ -3,41 +3,60 @@ ```python ETracker.calibrate( calibration_points, - infant_stims, + infant_stims=None, shuffle=True, - audio=None, + audio=True, anim_type='zoom', - save_calib=False, - num_samples=5, + visualization_style='circles', ) ``` -Run the infant-friendly calibration procedure. +Run infant-friendly calibration procedure. -Automatically selects the calibration method based on operating mode -(real eye tracker vs. simulation). Uses animated stimuli and optional -audio to engage infants during calibration. +Performs eye tracker calibration using animated stimuli to engage infant +participants. The calibration establishes the mapping between eye position +and screen coordinates, which is essential for accurate gaze data collection. +Automatically selects the appropriate calibration method based on operating +mode (real eye tracker vs. mouse simulation). ## Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------------------|-------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------| -| calibration_points | list\[tuple\[float, float\]\] | Target locations in PsychoPy coordinates (e.g., height units). Typically 59 points distributed across the screen. | _required_ | -| infant_stims | list\[str\] | Paths to engaging image files for calibration targets (e.g., animated characters, colorful objects). | _required_ | -| shuffle | bool | Whether to randomize stimulus presentation order. Default True. | `True` | -| audio | psychopy.sound.Sound \| None | Attention-getting sound to play during calibration. Default None. | `None` | -| anim_type | (zoom, trill) | Animation style for the stimuli. Default 'zoom'. | `'zoom'` | -| save_calib | bool \| str | Controls saving of calibration after a successful run: - False: do not save (default) - True: save using default naming (timestamped) - str: save to this filename; if it has no extension, '.dat' is added. | `False` | -| num_samples | int | Samples per point in simulation mode. Default 5. | `5` | +| Name | Type | Description | Default | +|---------------------|--------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------| +| calibration_points | int or list of tuple | Calibration pattern specification: - 5: Standard 5-point pattern (4 corners + center). Default. - 9: Comprehensive 9-point pattern (33 grid). - list: Custom points in normalized coordinates [-1, 1]. Example: [(-0.4, 0.4), (0.4, 0.4), (0.0, 0.0)] | _required_ | +| infant_stims | list of str or True | Paths to engaging image files for calibration targets (e.g., colorful characters, animated objects). If True (default), uses built-in stimuli from the package. If fewer stimuli than calibration points are provided, stimuli are automatically repeated in sequence to cover all points (e.g., 3 stimuli for 7 points becomes [s1, s2, s3, s1, s2, s3, s1]). | `None` | +| shuffle | bool | Whether to randomize stimulus presentation order. When True (default), stimuli are shuffled after any necessary repetition and before assignment to calibration points. Set to False if you want deterministic stimulus-to-point mapping or specific stimulus ordering. Default True. | `True` | +| audio | bool or psychopy.sound.Sound or None | Controls attention-getting audio during calibration: - True: Uses built-in calibration sound (default). Sound loops continuously while stimulus is selected. - False or None: No audio feedback. - psychopy.sound.Sound: Uses your pre-loaded custom sound object. You are responsible for setting the sound parameters (e.g., loops=-1 for continuous looping). The audio provides auditory feedback when the experimenter selects a calibration point by pressing a number key. Default True. | `True` | +| anim_type | (zoom, trill) | Animation style for the calibration stimuli: - 'zoom': Smooth size oscillation (default) - 'trill': Rapid rotation with pauses | `'zoom'` | +| visualization_style | (lines, circles) | How to display calibration results: - 'lines': Draw lines from targets to gaze samples - 'circles': Draw small filled circles at gaze sample positions Default 'circles'. | `'lines'` | ## Returns {.doc-section .doc-section-returns} -| Name | Type | Description | -|--------|--------|--------------------------------------------------------------| -| | bool | True if calibration completed successfully, False otherwise. | +| Name | Type | Description | +|--------|--------|----------------------------------------------------------------------------------------------------------------------| +| | bool | True if calibration completed successfully and was accepted by the user, False if calibration was aborted or failed. | -## Notes {.doc-section .doc-section-notes} +## Examples {.doc-section .doc-section-examples} -- Real mode uses Tobii's calibration with result visualization. -- Simulation mode uses mouse position to approximate the process. -- If in simulation mode, any save request is safely skipped with a warning. \ No newline at end of file +```python +>>> # Standard 5-point calibration with default audio +>>> controller.calibrate(5) +``` + +```python +>>> # Calibration without audio +>>> controller.calibrate(5, audio=False) +``` + +```python +>>> # Custom audio +>>> from psychopy import sound +>>> my_sound = sound.Sound('custom_beep.wav', loops=-1) +>>> controller.calibrate(5, audio=my_sound) +``` + +```python +>>> # 9-point calibration with custom stimuli and trill animation +>>> controller.calibrate(9, infant_stims=['stim1.png', 'stim2.png'], +... anim_type='trill') +``` \ No newline at end of file diff --git a/Documentation/api/ETracker.qmd b/Documentation/api/ETracker.qmd index a0eb2b1..ca5fd65 100644 --- a/Documentation/api/ETracker.qmd +++ b/Documentation/api/ETracker.qmd @@ -1,7 +1,7 @@ # ETracker { #DeToX.ETracker } ```python -ETracker(win, etracker_id=0, simulate=False) +ETracker(win, etracker_id=0, simulate=False, verbose=True) ``` A high-level controller for running eye-tracking experiments with Tobii Pro and PsychoPy. @@ -22,7 +22,7 @@ This class is intended to be the first object you instantiate in your experiment | Name | Description | | --- | --- | -| [calibrate](#DeToX.ETracker.calibrate) | Run the infant-friendly calibration procedure. | +| [calibrate](#DeToX.ETracker.calibrate) | Run infant-friendly calibration procedure. | | [gaze_contingent](#DeToX.ETracker.gaze_contingent) | Initialize real-time gaze buffer for contingent applications. | | [get_gaze_position](#DeToX.ETracker.get_gaze_position) | Get current gaze position from rolling buffer. | | [load_calibration](#DeToX.ETracker.load_calibration) | Loads calibration data from a file and applies it to the eye tracker. | @@ -39,44 +39,63 @@ This class is intended to be the first object you instantiate in your experiment ```python ETracker.calibrate( calibration_points, - infant_stims, + infant_stims=None, shuffle=True, - audio=None, + audio=True, anim_type='zoom', - save_calib=False, - num_samples=5, + visualization_style='circles', ) ``` -Run the infant-friendly calibration procedure. +Run infant-friendly calibration procedure. -Automatically selects the calibration method based on operating mode -(real eye tracker vs. simulation). Uses animated stimuli and optional -audio to engage infants during calibration. +Performs eye tracker calibration using animated stimuli to engage infant +participants. The calibration establishes the mapping between eye position +and screen coordinates, which is essential for accurate gaze data collection. +Automatically selects the appropriate calibration method based on operating +mode (real eye tracker vs. mouse simulation). #### Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------------------|-------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------| -| calibration_points | list\[tuple\[float, float\]\] | Target locations in PsychoPy coordinates (e.g., height units). Typically 59 points distributed across the screen. | _required_ | -| infant_stims | list\[str\] | Paths to engaging image files for calibration targets (e.g., animated characters, colorful objects). | _required_ | -| shuffle | bool | Whether to randomize stimulus presentation order. Default True. | `True` | -| audio | psychopy.sound.Sound \| None | Attention-getting sound to play during calibration. Default None. | `None` | -| anim_type | (zoom, trill) | Animation style for the stimuli. Default 'zoom'. | `'zoom'` | -| save_calib | bool \| str | Controls saving of calibration after a successful run: - False: do not save (default) - True: save using default naming (timestamped) - str: save to this filename; if it has no extension, '.dat' is added. | `False` | -| num_samples | int | Samples per point in simulation mode. Default 5. | `5` | +| Name | Type | Description | Default | +|---------------------|--------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------| +| calibration_points | int or list of tuple | Calibration pattern specification: - 5: Standard 5-point pattern (4 corners + center). Default. - 9: Comprehensive 9-point pattern (33 grid). - list: Custom points in normalized coordinates [-1, 1]. Example: [(-0.4, 0.4), (0.4, 0.4), (0.0, 0.0)] | _required_ | +| infant_stims | list of str or True | Paths to engaging image files for calibration targets (e.g., colorful characters, animated objects). If True (default), uses built-in stimuli from the package. If fewer stimuli than calibration points are provided, stimuli are automatically repeated in sequence to cover all points (e.g., 3 stimuli for 7 points becomes [s1, s2, s3, s1, s2, s3, s1]). | `None` | +| shuffle | bool | Whether to randomize stimulus presentation order. When True (default), stimuli are shuffled after any necessary repetition and before assignment to calibration points. Set to False if you want deterministic stimulus-to-point mapping or specific stimulus ordering. Default True. | `True` | +| audio | bool or psychopy.sound.Sound or None | Controls attention-getting audio during calibration: - True: Uses built-in calibration sound (default). Sound loops continuously while stimulus is selected. - False or None: No audio feedback. - psychopy.sound.Sound: Uses your pre-loaded custom sound object. You are responsible for setting the sound parameters (e.g., loops=-1 for continuous looping). The audio provides auditory feedback when the experimenter selects a calibration point by pressing a number key. Default True. | `True` | +| anim_type | (zoom, trill) | Animation style for the calibration stimuli: - 'zoom': Smooth size oscillation (default) - 'trill': Rapid rotation with pauses | `'zoom'` | +| visualization_style | (lines, circles) | How to display calibration results: - 'lines': Draw lines from targets to gaze samples - 'circles': Draw small filled circles at gaze sample positions Default 'circles'. | `'lines'` | #### Returns {.doc-section .doc-section-returns} -| Name | Type | Description | -|--------|--------|--------------------------------------------------------------| -| | bool | True if calibration completed successfully, False otherwise. | +| Name | Type | Description | +|--------|--------|----------------------------------------------------------------------------------------------------------------------| +| | bool | True if calibration completed successfully and was accepted by the user, False if calibration was aborted or failed. | -#### Notes {.doc-section .doc-section-notes} +#### Examples {.doc-section .doc-section-examples} -- Real mode uses Tobii's calibration with result visualization. -- Simulation mode uses mouse position to approximate the process. -- If in simulation mode, any save request is safely skipped with a warning. +```python +>>> # Standard 5-point calibration with default audio +>>> controller.calibrate(5) +``` + +```python +>>> # Calibration without audio +>>> controller.calibrate(5, audio=False) +``` + +```python +>>> # Custom audio +>>> from psychopy import sound +>>> my_sound = sound.Sound('custom_beep.wav', loops=-1) +>>> controller.calibrate(5, audio=my_sound) +``` + +```python +>>> # 9-point calibration with custom stimuli and trill animation +>>> controller.calibrate(9, infant_stims=['stim1.png', 'stim2.png'], +... anim_type='trill') +``` ### gaze_contingent { #DeToX.ETracker.gaze_contingent } @@ -291,7 +310,7 @@ configuration changes are only made when the device is idle and connected. ### show_status { #DeToX.ETracker.show_status } ```python -ETracker.show_status(decision_key='space') +ETracker.show_status(decision_key='space', video_help=True) ``` Real-time visualization of participant's eye position in track box. @@ -300,17 +319,43 @@ Creates interactive display showing left/right eye positions and distance from screen. Useful for positioning participants before data collection. Updates continuously until exit key is pressed. +Optionally displays an instructional video in the background to help guide +participant positioning. You can use the built-in video, disable the video, +or provide your own custom MovieStim object. + #### Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------------|--------|------------------------------------------------------|-----------| -| decision_key | str | Key to press to exit visualization. Default 'space'. | `'space'` | +| Name | Type | Description | Default | +|--------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| +| decision_key | str | Key to press to exit visualization. Default 'space'. | `'space'` | +| video_help | bool or visual.MovieStim | Controls background video display: - True: Uses built-in instructional video (default) - False: No video displayed - visual.MovieStim: Uses your pre-loaded custom video. You are responsible for scaling (size) and positioning (pos) the MovieStim to fit your desired layout. Default True. | `True` | #### Notes {.doc-section .doc-section-notes} In simulation mode, use scroll wheel to adjust simulated distance. Eye positions shown as green (left) and red (right) circles. +The built-in video (when video_help=True) is sized at (1.06, 0.6) in +height units and positioned at (0, -0.08) to avoid covering the track box. + +#### Examples {.doc-section .doc-section-examples} + +```python +>>> # Use built-in video +>>> tracker.show_status() +``` + +```python +>>> # No video +>>> tracker.show_status(video_help=False) +``` + +```python +>>> # Custom video +>>> my_video = visual.MovieStim(win, 'custom.mp4', size=0.5, pos=(0, -0.2)) +>>> tracker.show_status(video_help=my_video) +``` + ### start_recording { #DeToX.ETracker.start_recording } ```python diff --git a/Documentation/api/ETracker.show_status.qmd b/Documentation/api/ETracker.show_status.qmd index 8d2fdf6..cae414d 100644 --- a/Documentation/api/ETracker.show_status.qmd +++ b/Documentation/api/ETracker.show_status.qmd @@ -1,7 +1,7 @@ # ETracker.show_status { #DeToX.ETracker.show_status } ```python -ETracker.show_status(decision_key='space') +ETracker.show_status(decision_key='space', video_help=True) ``` Real-time visualization of participant's eye position in track box. @@ -10,13 +10,39 @@ Creates interactive display showing left/right eye positions and distance from screen. Useful for positioning participants before data collection. Updates continuously until exit key is pressed. +Optionally displays an instructional video in the background to help guide +participant positioning. You can use the built-in video, disable the video, +or provide your own custom MovieStim object. + ## Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------------|--------|------------------------------------------------------|-----------| -| decision_key | str | Key to press to exit visualization. Default 'space'. | `'space'` | +| Name | Type | Description | Default | +|--------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| +| decision_key | str | Key to press to exit visualization. Default 'space'. | `'space'` | +| video_help | bool or visual.MovieStim | Controls background video display: - True: Uses built-in instructional video (default) - False: No video displayed - visual.MovieStim: Uses your pre-loaded custom video. You are responsible for scaling (size) and positioning (pos) the MovieStim to fit your desired layout. Default True. | `True` | ## Notes {.doc-section .doc-section-notes} In simulation mode, use scroll wheel to adjust simulated distance. -Eye positions shown as green (left) and red (right) circles. \ No newline at end of file +Eye positions shown as green (left) and red (right) circles. + +The built-in video (when video_help=True) is sized at (1.06, 0.6) in +height units and positioned at (0, -0.08) to avoid covering the track box. + +## Examples {.doc-section .doc-section-examples} + +```python +>>> # Use built-in video +>>> tracker.show_status() +``` + +```python +>>> # No video +>>> tracker.show_status(video_help=False) +``` + +```python +>>> # Custom video +>>> my_video = visual.MovieStim(win, 'custom.mp4', size=0.5, pos=(0, -0.2)) +>>> tracker.show_status(video_help=my_video) +``` \ No newline at end of file diff --git a/Documentation/api/InfantStimuli.qmd b/Documentation/api/InfantStimuli.qmd index b06a015..a04ca7d 100644 --- a/Documentation/api/InfantStimuli.qmd +++ b/Documentation/api/InfantStimuli.qmd @@ -1,7 +1,7 @@ # InfantStimuli { #DeToX.InfantStimuli } ```python -InfantStimuli(win, infant_stims, shuffle=True, **kwargs) +InfantStimuli(win, infant_stims, **kwargs) ``` Stimuli manager for infant-friendly calibration procedures. diff --git a/Documentation/api/MouseCalibrationSession.qmd b/Documentation/api/MouseCalibrationSession.qmd index 9e292a9..b5b3234 100644 --- a/Documentation/api/MouseCalibrationSession.qmd +++ b/Documentation/api/MouseCalibrationSession.qmd @@ -5,9 +5,10 @@ MouseCalibrationSession( win, infant_stims, mouse, - shuffle=True, audio=None, anim_type='zoom', + visualization_style='lines', + verbose=True, ) ``` @@ -32,7 +33,7 @@ data collection modes. ### run { #DeToX.MouseCalibrationSession.run } ```python -MouseCalibrationSession.run(calibration_points, num_samples=5) +MouseCalibrationSession.run(calibration_points) ``` Main function to run the mouse-based calibration routine. @@ -43,10 +44,9 @@ calibration to ensure consistency across modes. #### Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------------------|------------------------|---------------------------------------------------------------------------------------------------------------------------|------------| -| calibration_points | list of (float, float) | List of target positions in PsychoPy coordinates. Typically 5-9 points distributed across the screen. | _required_ | -| num_samples | int | How many mouse position samples to collect at each calibration point. More samples provide smoother averaging. Default 5. | `5` | +| Name | Type | Description | Default | +|--------------------|------------------------|----------------------------------------------------------------------------------------------------------------|------------| +| calibration_points | list of (float, float) | List of calibration points in NORMALIZED coordinates [-1, 1]. Will be converted to window units automatically. | _required_ | #### Returns {.doc-section .doc-section-returns} diff --git a/Documentation/api/NicePrint.qmd b/Documentation/api/NicePrint.qmd index 69a6ea5..856e66b 100644 --- a/Documentation/api/NicePrint.qmd +++ b/Documentation/api/NicePrint.qmd @@ -1,7 +1,7 @@ # NicePrint { #DeToX.NicePrint } ```python -NicePrint(body, title='') +NicePrint(body, title='', verbose=True) ``` Print a message in a box with an optional title AND return the formatted text. @@ -18,10 +18,11 @@ environments. ## Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------| -| body | str | The string to print inside the box. Can contain multiple lines separated by newline characters. Each line will be padded to align within the box. | _required_ | -| title | str | A title to print on the top border of the box. The title will be centered within the top border. If empty string or not provided, the top border will be solid. Default empty string. | `''` | +| Name | Type | Description | Default | +|---------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------| +| body | str | The string to print inside the box. Can contain multiple lines separated by newline characters. Each line will be padded to align within the box. | _required_ | +| title | str | A title to print on the top border of the box. The title will be centered within the top border. If empty string or not provided, the top border will be solid. Default empty string. | `''` | +| verbose | bool | If True, the formatted box will be printed to the console. Default is True. | `True` | ## Returns {.doc-section .doc-section-returns} diff --git a/Documentation/api/TobiiCalibrationSession.qmd b/Documentation/api/TobiiCalibrationSession.qmd index deaa6f5..109667c 100644 --- a/Documentation/api/TobiiCalibrationSession.qmd +++ b/Documentation/api/TobiiCalibrationSession.qmd @@ -5,9 +5,10 @@ TobiiCalibrationSession( win, calibration_api, infant_stims, - shuffle=True, audio=None, anim_type='zoom', + visualization_style='lines', + verbose=True, ) ``` @@ -43,9 +44,9 @@ any subset of points until satisfied. #### Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|------------| -| calibration_points | list of (float, float) | List of PsychoPy (x, y) positions for calibration targets. Typically 5-9 points distributed across the screen for comprehensive coverage. | _required_ | +| Name | Type | Description | Default | +|--------------------|------------------------|--------------------------------------------------------------------------------------------------------------------------------|------------| +| calibration_points | list of (float, float) | List of calibration points in NORMALIZED coordinates [-1, 1]. Will be converted to window units and then to Tobii ADCS format. | _required_ | #### Returns {.doc-section .doc-section-returns} diff --git a/Documentation/api/_sidebar.yml b/Documentation/api/_sidebar.yml index d619496..4b29faf 100644 --- a/Documentation/api/_sidebar.yml +++ b/Documentation/api/_sidebar.yml @@ -41,9 +41,9 @@ website: section: Utilities - contents: - api/ETSettings.AnimationSettings.qmd + - api/ETSettings.CalibrationPatterns.qmd - api/ETSettings.CalibrationColors.qmd - api/ETSettings.UIElementSizes.qmd - - api/ETSettings.FontSizeMultipliers.qmd section: Configuration Settings id: api - id: dummy-sidebar diff --git a/Documentation/api/index.qmd b/Documentation/api/index.qmd index 0e8a773..69303ec 100644 --- a/Documentation/api/index.qmd +++ b/Documentation/api/index.qmd @@ -29,7 +29,7 @@ Methods for running and managing eye tracker calibration. These include display | | | | --- | --- | | [ETracker.show_status](ETracker.show_status.qmd#DeToX.ETracker.show_status) | Real-time visualization of participant's eye position in track box. | -| [ETracker.calibrate](ETracker.calibrate.qmd#DeToX.ETracker.calibrate) | Run the infant-friendly calibration procedure. | +| [ETracker.calibrate](ETracker.calibrate.qmd#DeToX.ETracker.calibrate) | Run infant-friendly calibration procedure. | | [ETracker.save_calibration](ETracker.save_calibration.qmd#DeToX.ETracker.save_calibration) | Save the current calibration data to a file. | | [ETracker.load_calibration](ETracker.load_calibration.qmd#DeToX.ETracker.load_calibration) | Loads calibration data from a file and applies it to the eye tracker. | @@ -87,6 +87,6 @@ Configuration classes and module-level instances for customizing the behavior a | | | | --- | --- | | [ETSettings.AnimationSettings](ETSettings.AnimationSettings.qmd#DeToX.ETSettings.AnimationSettings) | Animation parameters for calibration stimuli. | +| [ETSettings.CalibrationPatterns](ETSettings.CalibrationPatterns.qmd#DeToX.ETSettings.CalibrationPatterns) | Standard calibration point patterns in normalized coordinates. | | [ETSettings.CalibrationColors](ETSettings.CalibrationColors.qmd#DeToX.ETSettings.CalibrationColors) | Color settings for calibration visual elements. | -| [ETSettings.UIElementSizes](ETSettings.UIElementSizes.qmd#DeToX.ETSettings.UIElementSizes) | Size settings for user interface elements. | -| [ETSettings.FontSizeMultipliers](ETSettings.FontSizeMultipliers.qmd#DeToX.ETSettings.FontSizeMultipliers) | Font size multipliers for different text types. | \ No newline at end of file +| [ETSettings.UIElementSizes](ETSettings.UIElementSizes.qmd#DeToX.ETSettings.UIElementSizes) | Size settings for user interface elements. | \ No newline at end of file diff --git a/Documentation/index.qmd b/Documentation/index.qmd index 21f60d4..0cea863 100644 --- a/Documentation/index.qmd +++ b/Documentation/index.qmd @@ -10,7 +10,7 @@ format: ```{=html} Logo diff --git a/Documentation/objects.json b/Documentation/objects.json index bf8de95..6949c8e 100644 --- a/Documentation/objects.json +++ b/Documentation/objects.json @@ -1 +1 @@ -{"project": "DeToX", "version": "0.0.9999", "count": 84, "items": [{"name": "DeToX.ETracker.calibrate", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.calibrate", "dispname": "-"}, {"name": "DeToX.Base.ETracker.calibrate", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.calibrate", "dispname": "DeToX.ETracker.calibrate"}, {"name": "DeToX.ETracker.gaze_contingent", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.gaze_contingent", "dispname": "-"}, {"name": "DeToX.Base.ETracker.gaze_contingent", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.gaze_contingent", "dispname": "DeToX.ETracker.gaze_contingent"}, {"name": "DeToX.ETracker.get_gaze_position", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.get_gaze_position", "dispname": "-"}, {"name": "DeToX.Base.ETracker.get_gaze_position", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.get_gaze_position", "dispname": "DeToX.ETracker.get_gaze_position"}, {"name": "DeToX.ETracker.load_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.load_calibration", "dispname": "-"}, {"name": "DeToX.Base.ETracker.load_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.load_calibration", "dispname": "DeToX.ETracker.load_calibration"}, {"name": "DeToX.ETracker.record_event", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.record_event", "dispname": "-"}, {"name": "DeToX.Base.ETracker.record_event", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.record_event", "dispname": "DeToX.ETracker.record_event"}, {"name": "DeToX.ETracker.save_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.save_calibration", "dispname": "-"}, {"name": "DeToX.Base.ETracker.save_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.save_calibration", "dispname": "DeToX.ETracker.save_calibration"}, {"name": "DeToX.ETracker.save_data", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.save_data", "dispname": "-"}, {"name": "DeToX.Base.ETracker.save_data", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.save_data", "dispname": "DeToX.ETracker.save_data"}, {"name": "DeToX.ETracker.set_eyetracking_settings", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.set_eyetracking_settings", "dispname": "-"}, {"name": "DeToX.Base.ETracker.set_eyetracking_settings", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.set_eyetracking_settings", "dispname": "DeToX.ETracker.set_eyetracking_settings"}, {"name": "DeToX.ETracker.show_status", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.show_status", "dispname": "-"}, {"name": "DeToX.Base.ETracker.show_status", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.show_status", "dispname": "DeToX.ETracker.show_status"}, {"name": "DeToX.ETracker.start_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.start_recording", "dispname": "-"}, {"name": "DeToX.Base.ETracker.start_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.start_recording", "dispname": "DeToX.ETracker.start_recording"}, {"name": "DeToX.ETracker.stop_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.stop_recording", "dispname": "-"}, {"name": "DeToX.Base.ETracker.stop_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.stop_recording", "dispname": "DeToX.ETracker.stop_recording"}, {"name": "DeToX.ETracker", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker", "dispname": "-"}, {"name": "DeToX.Base.ETracker", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker", "dispname": "DeToX.ETracker"}, {"name": "DeToX.ETracker.start_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.start_recording.html#DeToX.ETracker.start_recording", "dispname": "-"}, {"name": "DeToX.Base.ETracker.start_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.start_recording.html#DeToX.ETracker.start_recording", "dispname": "DeToX.ETracker.start_recording"}, {"name": "DeToX.ETracker.stop_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.stop_recording.html#DeToX.ETracker.stop_recording", "dispname": "-"}, {"name": "DeToX.Base.ETracker.stop_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.stop_recording.html#DeToX.ETracker.stop_recording", "dispname": "DeToX.ETracker.stop_recording"}, {"name": "DeToX.ETracker.record_event", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.record_event.html#DeToX.ETracker.record_event", "dispname": "-"}, {"name": "DeToX.Base.ETracker.record_event", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.record_event.html#DeToX.ETracker.record_event", "dispname": "DeToX.ETracker.record_event"}, {"name": "DeToX.ETracker.save_data", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.save_data.html#DeToX.ETracker.save_data", "dispname": "-"}, {"name": "DeToX.Base.ETracker.save_data", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.save_data.html#DeToX.ETracker.save_data", "dispname": "DeToX.ETracker.save_data"}, {"name": "DeToX.ETracker.show_status", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.show_status.html#DeToX.ETracker.show_status", "dispname": "-"}, {"name": "DeToX.Base.ETracker.show_status", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.show_status.html#DeToX.ETracker.show_status", "dispname": "DeToX.ETracker.show_status"}, {"name": "DeToX.ETracker.calibrate", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.calibrate.html#DeToX.ETracker.calibrate", "dispname": "-"}, {"name": "DeToX.Base.ETracker.calibrate", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.calibrate.html#DeToX.ETracker.calibrate", "dispname": "DeToX.ETracker.calibrate"}, {"name": "DeToX.ETracker.save_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.save_calibration.html#DeToX.ETracker.save_calibration", "dispname": "-"}, {"name": "DeToX.Base.ETracker.save_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.save_calibration.html#DeToX.ETracker.save_calibration", "dispname": "DeToX.ETracker.save_calibration"}, {"name": "DeToX.ETracker.load_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.load_calibration.html#DeToX.ETracker.load_calibration", "dispname": "-"}, {"name": "DeToX.Base.ETracker.load_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.load_calibration.html#DeToX.ETracker.load_calibration", "dispname": "DeToX.ETracker.load_calibration"}, {"name": "DeToX.ETracker.gaze_contingent", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.gaze_contingent.html#DeToX.ETracker.gaze_contingent", "dispname": "-"}, {"name": "DeToX.Base.ETracker.gaze_contingent", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.gaze_contingent.html#DeToX.ETracker.gaze_contingent", "dispname": "DeToX.ETracker.gaze_contingent"}, {"name": "DeToX.ETracker.get_gaze_position", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.get_gaze_position.html#DeToX.ETracker.get_gaze_position", "dispname": "-"}, {"name": "DeToX.Base.ETracker.get_gaze_position", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.get_gaze_position.html#DeToX.ETracker.get_gaze_position", "dispname": "DeToX.ETracker.get_gaze_position"}, {"name": "DeToX.BaseCalibrationSession.check_points", "domain": "py", "role": "function", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession.check_points", "dispname": "-"}, {"name": "DeToX.Calibration.BaseCalibrationSession.check_points", "domain": "py", "role": "function", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession.check_points", "dispname": "DeToX.BaseCalibrationSession.check_points"}, {"name": "DeToX.BaseCalibrationSession.show_message_and_wait", "domain": "py", "role": "function", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession.show_message_and_wait", "dispname": "-"}, {"name": "DeToX.Calibration.BaseCalibrationSession.show_message_and_wait", "domain": "py", "role": "function", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession.show_message_and_wait", "dispname": "DeToX.BaseCalibrationSession.show_message_and_wait"}, {"name": "DeToX.BaseCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession", "dispname": "-"}, {"name": "DeToX.Calibration.BaseCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession", "dispname": "DeToX.BaseCalibrationSession"}, {"name": "DeToX.TobiiCalibrationSession.run", "domain": "py", "role": "function", "priority": "1", "uri": "api/TobiiCalibrationSession.html#DeToX.TobiiCalibrationSession.run", "dispname": "-"}, {"name": "DeToX.Calibration.TobiiCalibrationSession.run", "domain": "py", "role": "function", "priority": "1", "uri": "api/TobiiCalibrationSession.html#DeToX.TobiiCalibrationSession.run", "dispname": "DeToX.TobiiCalibrationSession.run"}, {"name": "DeToX.TobiiCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/TobiiCalibrationSession.html#DeToX.TobiiCalibrationSession", "dispname": "-"}, {"name": "DeToX.Calibration.TobiiCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/TobiiCalibrationSession.html#DeToX.TobiiCalibrationSession", "dispname": "DeToX.TobiiCalibrationSession"}, {"name": "DeToX.MouseCalibrationSession.run", "domain": "py", "role": "function", "priority": "1", "uri": "api/MouseCalibrationSession.html#DeToX.MouseCalibrationSession.run", "dispname": "-"}, {"name": "DeToX.Calibration.MouseCalibrationSession.run", "domain": "py", "role": "function", "priority": "1", "uri": "api/MouseCalibrationSession.html#DeToX.MouseCalibrationSession.run", "dispname": "DeToX.MouseCalibrationSession.run"}, {"name": "DeToX.MouseCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/MouseCalibrationSession.html#DeToX.MouseCalibrationSession", "dispname": "-"}, {"name": "DeToX.Calibration.MouseCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/MouseCalibrationSession.html#DeToX.MouseCalibrationSession", "dispname": "DeToX.MouseCalibrationSession"}, {"name": "DeToX.convert_height_to_units", "domain": "py", "role": "function", "priority": "1", "uri": "api/convert_height_to_units.html#DeToX.convert_height_to_units", "dispname": "-"}, {"name": "DeToX.Coords.convert_height_to_units", "domain": "py", "role": "function", "priority": "1", "uri": "api/convert_height_to_units.html#DeToX.convert_height_to_units", "dispname": "DeToX.convert_height_to_units"}, {"name": "DeToX.get_psychopy_pos", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_psychopy_pos.html#DeToX.get_psychopy_pos", "dispname": "-"}, {"name": "DeToX.Coords.get_psychopy_pos", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_psychopy_pos.html#DeToX.get_psychopy_pos", "dispname": "DeToX.get_psychopy_pos"}, {"name": "DeToX.psychopy_to_pixels", "domain": "py", "role": "function", "priority": "1", "uri": "api/psychopy_to_pixels.html#DeToX.psychopy_to_pixels", "dispname": "-"}, {"name": "DeToX.Coords.psychopy_to_pixels", "domain": "py", "role": "function", "priority": "1", "uri": "api/psychopy_to_pixels.html#DeToX.psychopy_to_pixels", "dispname": "DeToX.psychopy_to_pixels"}, {"name": "DeToX.get_tobii_pos", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_tobii_pos.html#DeToX.get_tobii_pos", "dispname": "-"}, {"name": "DeToX.Coords.get_tobii_pos", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_tobii_pos.html#DeToX.get_tobii_pos", "dispname": "DeToX.get_tobii_pos"}, {"name": "DeToX.pix2tobii", "domain": "py", "role": "function", "priority": "1", "uri": "api/pix2tobii.html#DeToX.pix2tobii", "dispname": "-"}, {"name": "DeToX.Coords.pix2tobii", "domain": "py", "role": "function", "priority": "1", "uri": "api/pix2tobii.html#DeToX.pix2tobii", "dispname": "DeToX.pix2tobii"}, {"name": "DeToX.tobii2pix", "domain": "py", "role": "function", "priority": "1", "uri": "api/tobii2pix.html#DeToX.tobii2pix", "dispname": "-"}, {"name": "DeToX.Coords.tobii2pix", "domain": "py", "role": "function", "priority": "1", "uri": "api/tobii2pix.html#DeToX.tobii2pix", "dispname": "DeToX.tobii2pix"}, {"name": "DeToX.get_psychopy_pos_from_trackbox", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_psychopy_pos_from_trackbox.html#DeToX.get_psychopy_pos_from_trackbox", "dispname": "-"}, {"name": "DeToX.Coords.get_psychopy_pos_from_trackbox", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_psychopy_pos_from_trackbox.html#DeToX.get_psychopy_pos_from_trackbox", "dispname": "DeToX.get_psychopy_pos_from_trackbox"}, {"name": "DeToX.NicePrint", "domain": "py", "role": "function", "priority": "1", "uri": "api/NicePrint.html#DeToX.NicePrint", "dispname": "-"}, {"name": "DeToX.Utils.NicePrint", "domain": "py", "role": "function", "priority": "1", "uri": "api/NicePrint.html#DeToX.NicePrint", "dispname": "DeToX.NicePrint"}, {"name": "DeToX.InfantStimuli.get_stim", "domain": "py", "role": "function", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli.get_stim", "dispname": "-"}, {"name": "DeToX.Utils.InfantStimuli.get_stim", "domain": "py", "role": "function", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli.get_stim", "dispname": "DeToX.InfantStimuli.get_stim"}, {"name": "DeToX.InfantStimuli.get_stim_original_size", "domain": "py", "role": "function", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli.get_stim_original_size", "dispname": "-"}, {"name": "DeToX.Utils.InfantStimuli.get_stim_original_size", "domain": "py", "role": "function", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli.get_stim_original_size", "dispname": "DeToX.InfantStimuli.get_stim_original_size"}, {"name": "DeToX.InfantStimuli", "domain": "py", "role": "class", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli", "dispname": "-"}, {"name": "DeToX.Utils.InfantStimuli", "domain": "py", "role": "class", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli", "dispname": "DeToX.InfantStimuli"}, {"name": "DeToX.ETSettings.AnimationSettings", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETSettings.AnimationSettings.html#DeToX.ETSettings.AnimationSettings", "dispname": "-"}, {"name": "DeToX.ETSettings.CalibrationColors", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETSettings.CalibrationColors.html#DeToX.ETSettings.CalibrationColors", "dispname": "-"}, {"name": "DeToX.ETSettings.UIElementSizes", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETSettings.UIElementSizes.html#DeToX.ETSettings.UIElementSizes", "dispname": "-"}, {"name": "DeToX.ETSettings.FontSizeMultipliers", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETSettings.FontSizeMultipliers.html#DeToX.ETSettings.FontSizeMultipliers", "dispname": "-"}]} \ No newline at end of file +{"project": "DeToX", "version": "0.0.9999", "count": 84, "items": [{"name": "DeToX.ETracker.calibrate", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.calibrate", "dispname": "-"}, {"name": "DeToX.Base.ETracker.calibrate", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.calibrate", "dispname": "DeToX.ETracker.calibrate"}, {"name": "DeToX.ETracker.gaze_contingent", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.gaze_contingent", "dispname": "-"}, {"name": "DeToX.Base.ETracker.gaze_contingent", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.gaze_contingent", "dispname": "DeToX.ETracker.gaze_contingent"}, {"name": "DeToX.ETracker.get_gaze_position", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.get_gaze_position", "dispname": "-"}, {"name": "DeToX.Base.ETracker.get_gaze_position", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.get_gaze_position", "dispname": "DeToX.ETracker.get_gaze_position"}, {"name": "DeToX.ETracker.load_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.load_calibration", "dispname": "-"}, {"name": "DeToX.Base.ETracker.load_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.load_calibration", "dispname": "DeToX.ETracker.load_calibration"}, {"name": "DeToX.ETracker.record_event", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.record_event", "dispname": "-"}, {"name": "DeToX.Base.ETracker.record_event", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.record_event", "dispname": "DeToX.ETracker.record_event"}, {"name": "DeToX.ETracker.save_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.save_calibration", "dispname": "-"}, {"name": "DeToX.Base.ETracker.save_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.save_calibration", "dispname": "DeToX.ETracker.save_calibration"}, {"name": "DeToX.ETracker.save_data", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.save_data", "dispname": "-"}, {"name": "DeToX.Base.ETracker.save_data", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.save_data", "dispname": "DeToX.ETracker.save_data"}, {"name": "DeToX.ETracker.set_eyetracking_settings", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.set_eyetracking_settings", "dispname": "-"}, {"name": "DeToX.Base.ETracker.set_eyetracking_settings", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.set_eyetracking_settings", "dispname": "DeToX.ETracker.set_eyetracking_settings"}, {"name": "DeToX.ETracker.show_status", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.show_status", "dispname": "-"}, {"name": "DeToX.Base.ETracker.show_status", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.show_status", "dispname": "DeToX.ETracker.show_status"}, {"name": "DeToX.ETracker.start_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.start_recording", "dispname": "-"}, {"name": "DeToX.Base.ETracker.start_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.start_recording", "dispname": "DeToX.ETracker.start_recording"}, {"name": "DeToX.ETracker.stop_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.stop_recording", "dispname": "-"}, {"name": "DeToX.Base.ETracker.stop_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker.stop_recording", "dispname": "DeToX.ETracker.stop_recording"}, {"name": "DeToX.ETracker", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker", "dispname": "-"}, {"name": "DeToX.Base.ETracker", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETracker.html#DeToX.ETracker", "dispname": "DeToX.ETracker"}, {"name": "DeToX.ETracker.start_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.start_recording.html#DeToX.ETracker.start_recording", "dispname": "-"}, {"name": "DeToX.Base.ETracker.start_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.start_recording.html#DeToX.ETracker.start_recording", "dispname": "DeToX.ETracker.start_recording"}, {"name": "DeToX.ETracker.stop_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.stop_recording.html#DeToX.ETracker.stop_recording", "dispname": "-"}, {"name": "DeToX.Base.ETracker.stop_recording", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.stop_recording.html#DeToX.ETracker.stop_recording", "dispname": "DeToX.ETracker.stop_recording"}, {"name": "DeToX.ETracker.record_event", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.record_event.html#DeToX.ETracker.record_event", "dispname": "-"}, {"name": "DeToX.Base.ETracker.record_event", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.record_event.html#DeToX.ETracker.record_event", "dispname": "DeToX.ETracker.record_event"}, {"name": "DeToX.ETracker.save_data", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.save_data.html#DeToX.ETracker.save_data", "dispname": "-"}, {"name": "DeToX.Base.ETracker.save_data", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.save_data.html#DeToX.ETracker.save_data", "dispname": "DeToX.ETracker.save_data"}, {"name": "DeToX.ETracker.show_status", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.show_status.html#DeToX.ETracker.show_status", "dispname": "-"}, {"name": "DeToX.Base.ETracker.show_status", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.show_status.html#DeToX.ETracker.show_status", "dispname": "DeToX.ETracker.show_status"}, {"name": "DeToX.ETracker.calibrate", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.calibrate.html#DeToX.ETracker.calibrate", "dispname": "-"}, {"name": "DeToX.Base.ETracker.calibrate", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.calibrate.html#DeToX.ETracker.calibrate", "dispname": "DeToX.ETracker.calibrate"}, {"name": "DeToX.ETracker.save_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.save_calibration.html#DeToX.ETracker.save_calibration", "dispname": "-"}, {"name": "DeToX.Base.ETracker.save_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.save_calibration.html#DeToX.ETracker.save_calibration", "dispname": "DeToX.ETracker.save_calibration"}, {"name": "DeToX.ETracker.load_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.load_calibration.html#DeToX.ETracker.load_calibration", "dispname": "-"}, {"name": "DeToX.Base.ETracker.load_calibration", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.load_calibration.html#DeToX.ETracker.load_calibration", "dispname": "DeToX.ETracker.load_calibration"}, {"name": "DeToX.ETracker.gaze_contingent", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.gaze_contingent.html#DeToX.ETracker.gaze_contingent", "dispname": "-"}, {"name": "DeToX.Base.ETracker.gaze_contingent", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.gaze_contingent.html#DeToX.ETracker.gaze_contingent", "dispname": "DeToX.ETracker.gaze_contingent"}, {"name": "DeToX.ETracker.get_gaze_position", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.get_gaze_position.html#DeToX.ETracker.get_gaze_position", "dispname": "-"}, {"name": "DeToX.Base.ETracker.get_gaze_position", "domain": "py", "role": "function", "priority": "1", "uri": "api/ETracker.get_gaze_position.html#DeToX.ETracker.get_gaze_position", "dispname": "DeToX.ETracker.get_gaze_position"}, {"name": "DeToX.BaseCalibrationSession.check_points", "domain": "py", "role": "function", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession.check_points", "dispname": "-"}, {"name": "DeToX.Calibration.BaseCalibrationSession.check_points", "domain": "py", "role": "function", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession.check_points", "dispname": "DeToX.BaseCalibrationSession.check_points"}, {"name": "DeToX.BaseCalibrationSession.show_message_and_wait", "domain": "py", "role": "function", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession.show_message_and_wait", "dispname": "-"}, {"name": "DeToX.Calibration.BaseCalibrationSession.show_message_and_wait", "domain": "py", "role": "function", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession.show_message_and_wait", "dispname": "DeToX.BaseCalibrationSession.show_message_and_wait"}, {"name": "DeToX.BaseCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession", "dispname": "-"}, {"name": "DeToX.Calibration.BaseCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/BaseCalibrationSession.html#DeToX.BaseCalibrationSession", "dispname": "DeToX.BaseCalibrationSession"}, {"name": "DeToX.TobiiCalibrationSession.run", "domain": "py", "role": "function", "priority": "1", "uri": "api/TobiiCalibrationSession.html#DeToX.TobiiCalibrationSession.run", "dispname": "-"}, {"name": "DeToX.Calibration.TobiiCalibrationSession.run", "domain": "py", "role": "function", "priority": "1", "uri": "api/TobiiCalibrationSession.html#DeToX.TobiiCalibrationSession.run", "dispname": "DeToX.TobiiCalibrationSession.run"}, {"name": "DeToX.TobiiCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/TobiiCalibrationSession.html#DeToX.TobiiCalibrationSession", "dispname": "-"}, {"name": "DeToX.Calibration.TobiiCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/TobiiCalibrationSession.html#DeToX.TobiiCalibrationSession", "dispname": "DeToX.TobiiCalibrationSession"}, {"name": "DeToX.MouseCalibrationSession.run", "domain": "py", "role": "function", "priority": "1", "uri": "api/MouseCalibrationSession.html#DeToX.MouseCalibrationSession.run", "dispname": "-"}, {"name": "DeToX.Calibration.MouseCalibrationSession.run", "domain": "py", "role": "function", "priority": "1", "uri": "api/MouseCalibrationSession.html#DeToX.MouseCalibrationSession.run", "dispname": "DeToX.MouseCalibrationSession.run"}, {"name": "DeToX.MouseCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/MouseCalibrationSession.html#DeToX.MouseCalibrationSession", "dispname": "-"}, {"name": "DeToX.Calibration.MouseCalibrationSession", "domain": "py", "role": "class", "priority": "1", "uri": "api/MouseCalibrationSession.html#DeToX.MouseCalibrationSession", "dispname": "DeToX.MouseCalibrationSession"}, {"name": "DeToX.convert_height_to_units", "domain": "py", "role": "function", "priority": "1", "uri": "api/convert_height_to_units.html#DeToX.convert_height_to_units", "dispname": "-"}, {"name": "DeToX.Coords.convert_height_to_units", "domain": "py", "role": "function", "priority": "1", "uri": "api/convert_height_to_units.html#DeToX.convert_height_to_units", "dispname": "DeToX.convert_height_to_units"}, {"name": "DeToX.get_psychopy_pos", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_psychopy_pos.html#DeToX.get_psychopy_pos", "dispname": "-"}, {"name": "DeToX.Coords.get_psychopy_pos", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_psychopy_pos.html#DeToX.get_psychopy_pos", "dispname": "DeToX.get_psychopy_pos"}, {"name": "DeToX.psychopy_to_pixels", "domain": "py", "role": "function", "priority": "1", "uri": "api/psychopy_to_pixels.html#DeToX.psychopy_to_pixels", "dispname": "-"}, {"name": "DeToX.Coords.psychopy_to_pixels", "domain": "py", "role": "function", "priority": "1", "uri": "api/psychopy_to_pixels.html#DeToX.psychopy_to_pixels", "dispname": "DeToX.psychopy_to_pixels"}, {"name": "DeToX.get_tobii_pos", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_tobii_pos.html#DeToX.get_tobii_pos", "dispname": "-"}, {"name": "DeToX.Coords.get_tobii_pos", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_tobii_pos.html#DeToX.get_tobii_pos", "dispname": "DeToX.get_tobii_pos"}, {"name": "DeToX.pix2tobii", "domain": "py", "role": "function", "priority": "1", "uri": "api/pix2tobii.html#DeToX.pix2tobii", "dispname": "-"}, {"name": "DeToX.Coords.pix2tobii", "domain": "py", "role": "function", "priority": "1", "uri": "api/pix2tobii.html#DeToX.pix2tobii", "dispname": "DeToX.pix2tobii"}, {"name": "DeToX.tobii2pix", "domain": "py", "role": "function", "priority": "1", "uri": "api/tobii2pix.html#DeToX.tobii2pix", "dispname": "-"}, {"name": "DeToX.Coords.tobii2pix", "domain": "py", "role": "function", "priority": "1", "uri": "api/tobii2pix.html#DeToX.tobii2pix", "dispname": "DeToX.tobii2pix"}, {"name": "DeToX.get_psychopy_pos_from_trackbox", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_psychopy_pos_from_trackbox.html#DeToX.get_psychopy_pos_from_trackbox", "dispname": "-"}, {"name": "DeToX.Coords.get_psychopy_pos_from_trackbox", "domain": "py", "role": "function", "priority": "1", "uri": "api/get_psychopy_pos_from_trackbox.html#DeToX.get_psychopy_pos_from_trackbox", "dispname": "DeToX.get_psychopy_pos_from_trackbox"}, {"name": "DeToX.NicePrint", "domain": "py", "role": "function", "priority": "1", "uri": "api/NicePrint.html#DeToX.NicePrint", "dispname": "-"}, {"name": "DeToX.Utils.NicePrint", "domain": "py", "role": "function", "priority": "1", "uri": "api/NicePrint.html#DeToX.NicePrint", "dispname": "DeToX.NicePrint"}, {"name": "DeToX.InfantStimuli.get_stim", "domain": "py", "role": "function", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli.get_stim", "dispname": "-"}, {"name": "DeToX.Utils.InfantStimuli.get_stim", "domain": "py", "role": "function", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli.get_stim", "dispname": "DeToX.InfantStimuli.get_stim"}, {"name": "DeToX.InfantStimuli.get_stim_original_size", "domain": "py", "role": "function", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli.get_stim_original_size", "dispname": "-"}, {"name": "DeToX.Utils.InfantStimuli.get_stim_original_size", "domain": "py", "role": "function", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli.get_stim_original_size", "dispname": "DeToX.InfantStimuli.get_stim_original_size"}, {"name": "DeToX.InfantStimuli", "domain": "py", "role": "class", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli", "dispname": "-"}, {"name": "DeToX.Utils.InfantStimuli", "domain": "py", "role": "class", "priority": "1", "uri": "api/InfantStimuli.html#DeToX.InfantStimuli", "dispname": "DeToX.InfantStimuli"}, {"name": "DeToX.ETSettings.AnimationSettings", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETSettings.AnimationSettings.html#DeToX.ETSettings.AnimationSettings", "dispname": "-"}, {"name": "DeToX.ETSettings.CalibrationPatterns", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETSettings.CalibrationPatterns.html#DeToX.ETSettings.CalibrationPatterns", "dispname": "-"}, {"name": "DeToX.ETSettings.CalibrationColors", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETSettings.CalibrationColors.html#DeToX.ETSettings.CalibrationColors", "dispname": "-"}, {"name": "DeToX.ETSettings.UIElementSizes", "domain": "py", "role": "class", "priority": "1", "uri": "api/ETSettings.UIElementSizes.html#DeToX.ETSettings.UIElementSizes", "dispname": "-"}]} \ No newline at end of file diff --git a/Documentation/resources/Logosvg.png b/Documentation/resources/Logosvg.png new file mode 100644 index 0000000..921b3d7 Binary files /dev/null and b/Documentation/resources/Logosvg.png differ diff --git a/Documentation/resources/Logosvg.svg b/Documentation/resources/Logosvg.svg new file mode 100644 index 0000000..62e6235 --- /dev/null +++ b/Documentation/resources/Logosvg.svg @@ -0,0 +1,515 @@ + + + +DeToX diff --git a/Documentation/resources/Vids/CalibrationVid.mp4 b/Documentation/resources/Vids/CalibrationVid.mp4 new file mode 100644 index 0000000..2f6a3a0 Binary files /dev/null and b/Documentation/resources/Vids/CalibrationVid.mp4 differ diff --git a/Documentation/resources/Vids/ShowStatus.gif b/Documentation/resources/Vids/ShowStatus.gif new file mode 100644 index 0000000..852ee6a Binary files /dev/null and b/Documentation/resources/Vids/ShowStatus.gif differ diff --git a/Documentation/resources/full_logo2.png b/Documentation/resources/full_logo2.png new file mode 100644 index 0000000..6fed204 Binary files /dev/null and b/Documentation/resources/full_logo2.png differ diff --git a/Documentation/styles.scss b/Documentation/styles.scss index 12837af..1c1d84b 100644 --- a/Documentation/styles.scss +++ b/Documentation/styles.scss @@ -43,7 +43,7 @@ nav.navbar .quarto-navigation-tool > svg { /* Navbar logo size */ .navbar-logo { - max-height: 2rem; + max-height: 3.2rem; } diff --git a/docs/Vignettes/Calibration.html b/docs/Vignettes/Calibration.html new file mode 100644 index 0000000..0364605 --- /dev/null +++ b/docs/Vignettes/Calibration.html @@ -0,0 +1,1281 @@ + + + + + + + + + + + +Calibration – DeToX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + + + +
+ +
+
+

Calibration

+
+ + + +
+ +
+
Author
+
+

Tommaso Ghilardi

+
+
+ + + +
+ + +
+
+
Keywords
+

DeToX, Eye Tracking, Calibration, Setup, Tobii, PsychoPy, Infatn calibration, infant friendly, eye tracker setup, python

+
+
+ +
+ + +

Good eye tracking data starts long before you present your first stimulus—it begins with proper setup and calibration. Even the most carefully designed experiment will produce noisy, unusable data if the eye tracker isn’t configured correctly. This is particularly critical when testing infants and children, where data quality can be challenging even under ideal conditions. In this tutorial, we’ll walk through how to use DeToX to ensure the best possible data quality from the start.

+

We’ll focus on two essential steps:

+
    +
  1. positioning your participant in the eye tracker’s optimal tracking zone

  2. +
  3. running the calibration procedure

  4. +
+

Get these right, and everything else falls into place.

+
+

Part 1: Positioning Your Participant

+
+

Understanding the Track Box

+

Every eye tracker has a track box—an invisible 3D zone where it can accurately detect eyes. Step outside this zone, and tracking quality drops fast! While we try to seat everyone consistently, even small differences in posture or chair height can matter. The good news? DeToX makes checking position as easy as calling a single method.

+
+
+
+ +
+
+Warning +
+
+
+

This tutorial assumes you’ve completed Getting started. If not, start there first!!!

+
+
+
+
+

Setup Code

+

Let’s begin with our standard setup:

+
+
from psychopy import visual, core
+from DeToX import ETracker
+
+
+## Creat the window
+win = visual.Window(
+    size=[1920, 1080],  # Window dimensions in pixels
+    fullscr=True,       # Expand to fill the entire screen
+    units='pix'         # Use pixels as the measurement unit
+)
+
+
+## Connect to the eyetracker
+ET_controller = ETracker(win)
+
+

We’re following the same steps from the previous tutorial. First, we import the libraries we need—psychopy.visual for creating our display window and DeToX.ETracker for controlling the eye tracker.

+

Next, we create a PsychoPy window where all our stimuli will appear.

+

Finally, we connect to the Tobii eye tracker by creating an ETracker object. This automatically searches for connected devices, establishes communication, and links the tracker to our window. You’ll see connection info printed to confirm everything’s working. Now the ET_controller object is ready to control all eye-tracking operations!

+
+
+

Checking Position in Real-Time

+

Now for the magic—visualizing where your participant’s eyes are in the track box:

+
+
Et_controller.show_status()
+
+
+
+

What You’ll See

+

When you call show_status(), an animated video of animals appears to keep infants engaged. Overlaid on the video are two colored circles—🔵 light blue and 🔴 pink —showing where the tracker detects your participant’s eyes in real-time. A black rectangle marks the track box boundaries where tracking works best.

+

Below the rectangle, a green bar with a moving black line indicates distance from the screen. The line should be centered on the bar (about 65 cm distance).

+
+
+

+
+
+
+
+
+ +
+
+Simulation Mode +
+
+
+

If you’re running with simulate=True, the positioning interface uses your mouse instead of real eye tracker data. Move the mouse around to see the eye circles follow, and use the scroll wheel to simulate moving closer to or further from the screen.

+
+
+

Center both colored circles within the black rectangle. If they’re drifting toward the edges, ask the participant to lean in the needed direction, or adjust the eye tracker mount if possible.

+

For distance, watch the black line on the green bar. Too far left means too close (move back), too far right means too far (move forward). Aim for the center.

+

Press SPACE when positioning looks good—you’re ready for calibration!

+
+ +
+
+

Customizing the Positioning Display

+

By default, show_status() displays an animated video of animals to keep infants engaged while you adjust their position. However, you can customize this behavior using the video_help parameter:

+

video_help=True: Uses the built-in instructional video included with DeToX (default). This is the easiest option and works well for most studies.

+

video_help=False: Disables the video entirely, showing only the eye position circles and track box. Useful if you prefer a minimal display or if video playback causes performance issues.

+

video_help=visual.MovieStim(...): Uses your own custom video. You’ll need to pre-load and configure the MovieStim object yourself, including setting the appropriate size and position for your display layout.

+
+
+
+
+
+
+

Part 2: Calibration

+

With your participant positioned correctly, you’re ready for calibration. But what exactly is calibration, and why do we need it?

+
+

Understanding Calibration

+

Calibration teaches the eye tracker how to interpret each participant’s unique eye characteristics. Everyone’s eyes are slightly different—different sizes, shapes, reflection patterns—so the tracker needs a personalized model to accurately estimate where someone is looking.

+

The process is straightforward: you present targets at known locations on the screen, the participant looks at each one, and the tracker records the relationship between eye features and screen coordinates. This creates a custom mapping for that individual.

+
+
+

+
Image from tobii website
+
+
+

Sounds complex, right? It is—but DeToX handles the complexity for you. Here’s how simple it becomes:

+
+
+

Launching Calibration with DeToX

+
+
ET_controller.calibrate(
+    calibration_points = 5,
+    shuffle=True,
+    audio=True,
+    anim_type='zoom',
+    visualization_style='circles'
+)
+
+

Let’s break down what’s happening here:

+

calibration_points=5: Uses a standard 5-point calibration pattern (corners plus center). This is the default and works well for most studies. You can also choose 9 points for higher precision, or pass a custom list of coordinates in height units for specialized configurations.

+

shuffle=True: Randomizes which image appears at each calibration point. This prevents habituation and keeps participants engaged throughout the procedure.

+

audio=True: Plays an attention-getting sound along with the visual stimulus to help capture and maintain the participant’s focus. anim_type='zoom': Makes the stimuli gently pulse in size to attract attention. You can also use 'trill' for a rotating animation.

+

visualization_style='circles': Displays the calibration results using dots at each point. You can also choose 'lines' to show lines connecting the target to where the gaze landed.

+
+ +
+
+

Customizing Calibration Parameters

+

Beyond the basic configuration, you can customize several aspects of the calibration procedure to match your experimental needs:

+

infant_stims: By default (infant_stims=True), DeToX uses a set of engaging animal cartoons included with the package. These work well for most infant studies, but you can provide a list of file paths to your own images if you prefer custom stimuli that better match your study’s theme or participant age group.

+

audio: By default (audio=True), an attention-getting sound included with DeToX plays automatically when stimuli appear. Set this to None to disable audio entirely, or pass your own pre-loaded psychopy.sound.Sound object to use custom sounds that fit your experimental context.

+

calibration_points: By default uses a 5-point pattern (corners plus center). You can specify 9 for higher precision, or pass a custom list of coordinates in height units for specialized configurations tailored to your stimulus regions.

+
+
+
+
+
+

The Calibration Process

+
+

Step 1: Instructions

+

First, you’ll see instructions explaining the controls:

+
┌──────────────────── Calibration Setup ─────────────────────┐
+│Mouse-Based Calibration Setup:                              │
+│                                                            │
+│    - Press number keys (1-5) to select calibration points  │
+│    - Move your mouse to the animated stimulus              │
+│    - Press SPACE to collect samples at the selected point  │
+│    - Press ENTER to finish collecting and see results      │
+│    - Press ESCAPE to exit calibration                      │
+│                                                            │
+│    Any key will start calibration immediately!             │
+└────────────────────────────────────────────────────────────┘
+

these instructions will tell you how to control the calibration using your keyboard.

+

Press any key when you’re ready to begin.

+
+
+

Data Collection

+

The calibration screen appears with a thin red border indicating you’re in calibration mode. Press a number key (1-5) to display an animated stimulus at the corresponding calibration point. The participant should look at the stimulus while it animates. When you’re confident they’re fixating on the target, press SPACE to collect gaze samples. The system waits briefly (0.25 seconds) to ensure stable fixation, then records the eye tracking data for that point. Repeat this process for all calibration points. You don’t need to go in order.

+
+
+

Step 3: Review Results

+

Once you’ve collected data for all points (or whenever you’re satisfied), press ENTER to compute and visualize the calibration results. You’ll see a display showing the calibration targets and dots (or lines if you selected them in the visualization_style) to where the gaze samples actually landed.

+

At this stage, you have several options:

+
┌────────────── Calibration Results ───────────────┐
+│Review calibration results above.                 │
+│                                                  │
+│    - Press ENTER to accept calibration           │
+│    - Press Numbers → SPACE to retry some points  │
+│    - Press ESCAPE to restart calibration         │
+│                                                  │
+└──────────────────────────────────────────────────┘
+

Accept the calibration: If the results look good across all points, press SPACE to accept and move forward with your experiment.

+

Retry specific points: Notice one or two points with poor accuracy? Press the number keys corresponding to those points—they’ll highlight in yellow to confirm your selection. You can select multiple points if needed. Once you’ve marked all points for retry, press SPACE again to recollect data for just those points. This targeted approach is especially valuable with infants and children, where you might get excellent data at most points but struggle with one or two locations.

+

Start over: If the overall quality is poor or you want a fresh start, press ESCAPE to discard all data and restart the entire calibration procedure from the beginning.

+
+
+
+ +
+
+Simulation Mode +
+
+
+

When running with simulate=True, the calibration procedure uses mouse position instead of real eye tracker data. Press number keys to display stimuli at calibration points, move your mouse to each target location, and press SPACE to “collect” samples. This allows you to test your entire experiment workflow without needing physical eye tracking hardware.

+
+
+
+
+
+

Calibration Complete!

+

Congratulations! You’ve successfully positioned your participant and completed the calibration procedure using DeToX. With accurate calibration in place, you’re now ready to present your experimental stimuli and collect high-quality eye tracking data.

+

Here’s a video demonstrating the entire calibration workflow from start to finish:

+
+
+
+
+

Save and Load calibration

+

While we recommend performing calibration at the start of each session to ensure optimal accuracy, DeToX also allows you to save and load calibration data for convenience. In our opinion, this should only be used in special circumstances where there is a headrest and little to no chance of movement between sessions. However, if you need to save and reuse calibration data, here’s how:

+
+

Saving Calibration

+

After completing a successful calibration, you can save the calibration data to a file:

+
# Save with custom filename
+ET_controller.save_calibration(filename="S01_calibration.dat")
+
┌────── Calibration Saved ─────┐
+│Calibration data saved to:    │
+│S01_calibration.dat           │
+└──────────────────────────────┘
+

The calibration data is saved as a binary file (.dat format) that can be reloaded in future sessions. If you don’t specify a filename, DeToX automatically generates a timestamped name like 2024-01-15_14-30-00_calibration.dat.

+

you can also choose to use a GUI file dialog to select the save location:

+
# Save with GUI file dialog
+ET.save_calibration(use_gui=True)
+
+
+

Loading Calibration

+

To reuse a previously saved calibration in a new session:

+
# Load from specific file
+ET.load_calibration(filename="S01_calibration.dat")
+
┌───── Calibration Loaded ──────┐
+│Calibration data loaded from:  │
+│S01_calibration.dat            │
+└───────────────────────────────┘
+

or again, use a GUI file dialog to select the file:

+
# Load with GUI file dialog
+ET.load_calibration(use_gui=True)
+ + + + +
+
+ + Back to top
+ +
+ + + + + + \ No newline at end of file diff --git a/docs/Vignettes/GettingStarted.html b/docs/Vignettes/GettingStarted.html index d5a4a0f..3bffc12 100644 --- a/docs/Vignettes/GettingStarted.html +++ b/docs/Vignettes/GettingStarted.html @@ -123,6 +123,18 @@ }); + @@ -159,6 +171,10 @@
  • Getting Started +
  • +
  • + + Calibration
  • @@ -169,22 +185,8 @@
    - - + +
    @@ -198,6 +200,9 @@ +
    diff --git a/docs/Vignettes/Installation.html b/docs/Vignettes/Installation.html index 86ede74..7c5f61b 100644 --- a/docs/Vignettes/Installation.html +++ b/docs/Vignettes/Installation.html @@ -7,6 +7,8 @@ + + Installation – DeToX @@ -134,7 +148,7 @@ @@ -197,6 +201,9 @@
    +
    @@ -255,12 +262,32 @@

    On this page

    +
    +
    +
    Keywords
    +

    DeToX, PsychoPy, tobii_research, installation, eye-tracking, Tobii, Python, miniconda, virtual environment

    +
    +

    So you’re interested in using DeToX? Awesome! Let’s get you set up quickly.

    DeToX is designed as a lightweight wrapper around PsychoPy and tobii_research. Here’s the good news: tobii_research usually comes bundled with PsychoPy, which means the only real hurdle is installing PsychoPy itself. And yes, PsychoPy can be a bit tricky to install due to its many dependencies—but don’t worry, we’ll walk you through it. Once PsychoPy is up and running, adding DeToX is a breeze.

    +
    +
    +
    + +
    +
    +Eye Tracker Drivers Required +
    +
    +
    +

    Before DeToX can communicate with your Tobii eye tracker, you need to ensure the correct drivers are installed on your computer. The easiest way to do this is by downloading and installing the Tobii Pro Eye Tracker Manager—a free software provided by Tobii that allows you to installs the necessary drivers for your device.

    +

    As a bonus, the Eye Tracker Manager also includes a built-in calibration tool (designed for adult self-paced calibration), which can be useful for testing that your hardware is working properly before running DeToX.

    +
    +

    Installing PsychoPy

    Since PsychoPy is the main challenge, let’s tackle that first. You have two main options:

    @@ -278,16 +305,16 @@

    Installing PsychoPyThis method is ideal if you prefer working in an IDE (like Positron, VS Code, PyCharm, or Spyder) and want full control over your Python environment.

    Step 1: Create a Virtual Environment

    -

    We like to use miniforge to handle our environments and Python installations. Any other method would work as well, but for simplicity we’ll show you how we prefer to do it.

    +

    We like to use miniconda to handle our environments and Python installations. Any other method would work as well, but for simplicity we’ll show you how we prefer to do it.

    We recommend using Python 3.10 for the best compatibility:

    -
    mamba create -n detox_env python=3.10
    +
    conda create -n detox_env python=3.10

    This will create an environment called detox_env with python 3.10. Exactly what we need!

    You will probably need to confirm by pressing y, and after a few seconds you’ll have your environment with Python 3.10! Great!

    Step 2: Activate Environment and Install PsychoPy

    Now let’s activate this environment (making sure we’re using it) and then install PsychoPy:

    -
    mamba activate detox_env
    +
    conda activate detox_env
     pip install psychopy

    this will take some time but if you are lucky you will have psychopy in your enviroment

    Again, confirm if needed and you’re done! Amazing!

    @@ -311,29 +338,14 @@

    Step 1:

    Installing DeToX

    Once PsychoPy is installed, we can look at DeToX. Let’s gets our hand dirty! The installation is the same for both the Package and Standalone PsychoPy installations but some steps differ.

    -
    -
    -
    - -
    -
    -DeToX is Still in Development -
    -
    -
    -

    DeToX isn’t yet available on PyPI, so you’ll need to install it directly from our GitHub repository. Don’t worry—it’s straightforward, and we’ll guide you through it!

    -

    One requirement: You need Git installed on your system.

    -

    📥 Don’t have Git? Download it from git-scm.com—installation takes just a minute.

    -
    -

    Again make sure to be in the correct environment if you installed PsychoPy as a package. with the following command:

    -
    mamba activate detox_env
    +
    conda activate detox_env

    Then simply run:

    -
    pip install git+https://github.com/DevStart-Hub/DeToX.git
    +
    pip install dvst-detox

    Wait a few seconds, confirm if needed, and you are done!

    @@ -344,12 +356,26 @@

    Installing DeToX

  • Select “Plugins/package manager…”

  • Click on “Packages” in the top tabs

  • Click the “Open PIP terminal” button

  • -
  • Type the following command: pip install git+https://github.com/DevStart-Hub/DeToX.git

  • +
  • Type the following command: pip install devst-detox

  • That’s it! You now have both PsychoPy and DeToX installed and ready to use.

    +
    +
    +
    + +
    +
    +Install from git +
    +
    +
    +

    If you want to install the latest development version of DeToX directly from the GitHub repository, you can do so by replacing the installation command with the following:

    +
    pip install git+https://github.com/DevStart-Hub/DeToX.git
    +
    +
    @@ -850,131 +876,141 @@

    Installing DeToX

    diff --git a/docs/api/BaseCalibrationSession.html b/docs/api/BaseCalibrationSession.html index 4ee6999..7e869f0 100644 --- a/docs/api/BaseCalibrationSession.html +++ b/docs/api/BaseCalibrationSession.html @@ -122,6 +122,18 @@ }); + @@ -158,6 +170,10 @@
  • Getting Started +
  • +
  • + + Calibration
  • @@ -168,22 +184,8 @@
    - - + +

    @@ -197,6 +199,9 @@ +
    @@ -442,20 +447,20 @@ @@ -492,9 +497,9 @@

    BaseCalibrationSession

    BaseCalibrationSession(
         win,
         infant_stims,
    -    shuffle=True,
    -    audio=None,
    -    anim_type='zoom',
    +    audio=None,
    +    anim_type='zoom',
    +    visualization_style='lines',
     )

    Base class with common functionality for both calibration types.

    This abstract base class provides shared calibration functionality for both Tobii hardware-based and mouse-based simulation calibration sessions. It handles visual presentation, user interaction, animation, and result visualization while delegating hardware-specific data collection to subclasses.

    @@ -580,15 +585,15 @@

    Rais

    show_message_and_wait

    BaseCalibrationSession.show_message_and_wait(body, title='', pos=(0, -0.15))

    Display a message on screen and in console, then wait for keypress.

    -

    Shows formatted message both in the PsychoPy window and console output, then pauses execution until any key is pressed. Useful for instructions and status messages during calibration.

    +

    Shows formatted message both in the PsychoPy window and console output, enforces a minimum display time for readability and system stabilization, then pauses execution until any key is pressed.

    Parameters

    ----++++ @@ -602,42 +607,23 @@

    - + - + - +
    body strThe main message text to display. Will be formatted with box-drawing characters via NicePrint.The main message text to display. required
    title strTitle for the message box. Appears at the top of the formatted box. Default empty string.Title for the message box. Default empty string. ''
    pos tuplePosition of the message box center on screen in window units. Default (0, -0.15) places message slightly below center.Position of the message box center on screen. Default (0, -0.15). (0, -0.15)
    -
    -
    -

    Returns

    - - - - - - - - - - - - - - - -
    NameTypeDescription
    None
    @@ -1137,9 +1123,9 @@

    Re BaseCalibrationSession( win, infant_stims, - shuffle=True, - audio=None, - anim_type='zoom', + audio=None, + anim_type='zoom', + visualization_style='lines', ) ``` @@ -1195,22 +1181,16 @@

    Re Display a message on screen and in console, then wait for keypress. Shows formatted message both in the PsychoPy window and console output, -then pauses execution until any key is pressed. Useful for instructions -and status messages during calibration. +enforces a minimum display time for readability and system stabilization, +then pauses execution until any key is pressed. #### Parameters {.doc-section .doc-section-parameters} -| Name | Type | Description | Default | -|--------|--------|------------------------------------------------------------------------------------------------------------------------|--------------| -| body | str | The main message text to display. Will be formatted with box-drawing characters via NicePrint. | _required_ | -| title | str | Title for the message box. Appears at the top of the formatted box. Default empty string. | `''` | -| pos | tuple | Position of the message box center on screen in window units. Default (0, -0.15) places message slightly below center. | `(0, -0.15)` | - -#### Returns {.doc-section .doc-section-returns} - -| Name | Type | Description | -|--------|--------|---------------| -| | None | |

    +| Name | Type | Description | Default | +|--------|--------|-------------------------------------------------------------------|--------------| +| body | str | The main message text to display. | _required_ | +| title | str | Title for the message box. Default empty string. | `''` | +| pos | tuple | Position of the message box center on screen. Default (0, -0.15). | `(0, -0.15)` |