Repository: aeye-lab/pymovements
Pull request #676 (2024-02-09 10:00:29)

feat: add text stimulus class

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab) Report
Attention: `21 lines` in your changes are missing coverage. Please review.
> Comparison is base [(`e6e81a8`)](https://app.codecov.io/gh/aeye-lab/pymovements/commit/e6e81a8eaed72f045aeae3b906978c8a35050618?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab) 100.00% compared to head [(`c4066c5`)](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab) 99.14%.

> :exclamation: Current head c4066c5 differs from pull request most recent head 5ae4a6e. Consider uploading reports for the commit 5ae4a6e to get more accurate results

| [Files](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab) | Patch % | Lines |
|---|---|---|
| [src/pymovements/stimuli/stimulus.py](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab#diff-c3JjL3B5bW92ZW1lbnRzL3N0aW11bGkvc3RpbXVsdXMucHk=) | 54.54% | [10 Missing :warning: ](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab) |
| [src/pymovements/stimuli/stimulus\_files.py](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab#diff-c3JjL3B5bW92ZW1lbnRzL3N0aW11bGkvc3RpbXVsdXNfZmlsZXMucHk=) | 41.66% | [7 Missing :warning: ](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab) |
| [src/pymovements/stimuli/text\_stimulus.py](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab#diff-c3JjL3B5bW92ZW1lbnRzL3N0aW11bGkvdGV4dF9zdGltdWx1cy5weQ==) | 63.63% | [4 Missing :warning: ](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab) |

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff             @@
##              main     #676      +/-   ##
===========================================
- Coverage   100.00%   99.14%   -0.86%     
===========================================
  Files           54       58       +4     
  Lines         2423     2469      +46     
  Branches       614      618       +4     
===========================================
+ Hits          2423     2448      +25     
- Misses           0       21      +21     
```



</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/aeye-lab/pymovements/pull/676?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=aeye-lab).


Patch:
diff --git a/src/pymovements/__init__.py b/src/pymovements/__init__.py
index 13021b9..feec64b 100644
--- a/src/pymovements/__init__.py
+++ b/src/pymovements/__init__.py
@@ -24,6 +24,7 @@ from pymovements import events
 from pymovements import exceptions
 from pymovements import gaze
 from pymovements import plotting
+from pymovements import stimulus
 from pymovements import synthetic
 from pymovements import utils
 from pymovements.dataset import Dataset
@@ -37,6 +38,7 @@ from pymovements.events import EventProcessor
 from pymovements.gaze import Experiment
 from pymovements.gaze import GazeDataFrame
 from pymovements.gaze import Screen
+from pymovements.stimulus import text
 
 
 __all__ = [
@@ -59,8 +61,11 @@ __all__ = [
 
     'exceptions',
     'plotting',
+    'stimulus',
     'synthetic',
     'utils',
+
+    'text',
 ]
 
 __version__ = _version.get_versions()['version']
diff --git a/src/pymovements/stimulus/__init__.py b/src/pymovements/stimulus/__init__.py
new file mode 100644
index 0000000..b6025c5
--- /dev/null
+++ b/src/pymovements/stimulus/__init__.py
@@ -0,0 +1,35 @@
+# Copyright (c) 2024 The pymovements Project Authors
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+"""Provides access to stimulus classes.
+
+.. rubric:: Classes
+
+.. autosummary::
+   :toctree:
+   :template: class.rst
+
+    pymovements.stimulus.TextStimulus
+"""
+from pymovements.stimulus.text import TextStimulus
+
+
+__all__ = [
+    'TextStimulus',
+]
diff --git a/src/pymovements/stimulus/text.py b/src/pymovements/stimulus/text.py
new file mode 100644
index 0000000..51663ea
--- /dev/null
+++ b/src/pymovements/stimulus/text.py
@@ -0,0 +1,136 @@
+# Copyright (c) 2023-2024 The pymovements Project Authors
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+"""Module for the TextDataFrame."""
+from __future__ import annotations
+
+from pathlib import Path
+from typing import Any
+
+import polars as pl
+
+
+class TextStimulus:
+    """A DataFrame for gaze time series data.
+
+    Each row is a sample at a specific timestep.
+    Each column is a channel in the gaze time series.
+
+    Parameters
+    ----------
+    aois: pl.DataFrame
+        A stimulus dataframe.
+    aoi_column: str
+        Name of the column that contains the content of the aois.
+    pixel_x_column: str
+        Name of the column which contains the x coordinate of the areas of interest.
+    pixel_y_column: str
+        Name of the column which contains the y coordinate of the areas of interest.
+    width_column: str
+        Name of the column which contains the width of the area of interest.
+    height_column: str
+        Name of the column which contains the height of the area of interest.
+    page_column: str
+        Name of the column which contains the page information of the area of interest.
+    """
+
+    def __init__(
+            self,
+            aois: pl.DataFrame,
+            *,
+            aoi_column: str,
+            pixel_x_column: str,
+            pixel_y_column: str,
+            width_column: str,
+            height_column: str,
+            page_column: str,
+    ) -> None:
+
+        self.aois = aois.clone()
+        self.aoi_column = aoi_column
+        self.pixel_x_column = pixel_x_column
+        self.pixel_y_column = pixel_y_column
+        self.width_column = width_column
+        self.height_column = height_column
+        self.page_column = page_column
+
+
+def from_file(
+        aoi_path: str | Path,
+        *,
+        aoi_column: str,
+        pixel_x_column: str,
+        pixel_y_column: str,
+        width_column: str,
+        height_column: str,
+        page_column: str,
+        custom_read_kwargs: dict[str, Any] | None = None,
+) -> TextStimulus:
+    """Load text stimulus from file.
+
+    Parameters
+    ----------
+    aoi_path:  str | Path
+        Path to file to be read.
+    aoi_column: str
+        Name of the column that contains the content of the aois.
+    pixel_x_column: str
+        Name of the column which contains the x coordinate of the areas of interest.
+    pixel_y_column: str
+        Name of the column which contains the y coordinate of the areas of interest.
+    width_column: str
+        Name of the column which contains the width of the area of interest.
+    height_column: str
+        Name of the column which contains the height of the area of interest.
+    page_column: str
+        Name of the column which contains the page information of the area of interest.
+    custom_read_kwargs: dict[str, Any] | None
+        Custom read keyword arguments for polars. (default: None)
+
+    Returns
+    -------
+    TextStimulus
+        Returns the text stimulus file.
+    """
+    if isinstance(aoi_path, str):
+        aoi_path = Path(aoi_path)
+    if custom_read_kwargs is None:
+        custom_read_kwargs = {}
+
+    valid_extensions = {'.csv', '.tsv', '.txt'}
+    if aoi_path.suffix in valid_extensions:
+        stimulus_df = pl.read_csv(
+            aoi_path,
+            **custom_read_kwargs,
+        )
+    else:
+        raise ValueError(
+            f'unsupported file format "{aoi_path.suffix}".'
+            f'Supported formats are: {sorted(valid_extensions)}',
+        )
+
+    return TextStimulus(
+        aois=stimulus_df,
+        aoi_column=aoi_column,
+        pixel_x_column=pixel_x_column,
+        pixel_y_column=pixel_y_column,
+        width_column=width_column,
+        height_column=height_column,
+        page_column=page_column,
+    )


Test patch:
diff --git a/tests/files/toy_text_1_1_aoi.csv b/tests/files/toy_text_1_1_aoi.csv
new file mode 100644
index 0000000..f376ac1
--- /dev/null
+++ b/tests/files/toy_text_1_1_aoi.csv
@@ -0,0 +1,745 @@
+char,top_left_x,top_left_y,width,height,char_idx_in_line,line_idx,page,word
+W,400.0,122.0,14.95,23,0,0,question_1,What
+h,414.95,122.0,14.95,23,1,0,question_1,What
+a,429.9,122.0,14.95,23,2,0,question_1,What
+t,444.85,122.0,14.95,23,3,0,question_1,What
+ ,459.8,122.0,14.95,23,4,0,question_1,
+i,474.75,122.0,14.95,23,5,0,question_1,is
+s,489.7,122.0,14.95,23,6,0,question_1,is
+ ,504.65,122.0,14.95,23,7,0,question_1,
+p,519.5999999999999,122.0,14.95,23,8,0,question_1,pymovements?
+y,534.55,122.0,14.95,23,9,0,question_1,pymovements?
+m,549.5,122.0,14.95,23,10,0,question_1,pymovements?
+o,564.4499999999999,122.0,14.95,23,11,0,question_1,pymovements?
+v,579.3999999999999,122.0,14.95,23,12,0,question_1,pymovements?
+e,594.3499999999999,122.0,14.95,23,13,0,question_1,pymovements?
+m,609.3,122.0,14.95,23,14,0,question_1,pymovements?
+e,624.2499999999999,122.0,14.95,23,15,0,question_1,pymovements?
+n,639.1999999999998,122.0,14.95,23,16,0,question_1,pymovements?
+t,654.1499999999999,122.0,14.95,23,17,0,question_1,pymovements?
+s,669.0999999999999,122.0,14.95,23,18,0,question_1,pymovements?
+?,684.0499999999998,122.0,14.95,23,19,0,question_1,pymovements?
+A,400.0,480.12,15.0,22,0,0,question_1_target,A
+ ,415.0,480.12,15.0,22,1,0,question_1_target,
+P,430.0,480.12,15.0,22,2,0,question_1_target,Python
+y,445.0,480.12,15.0,22,3,0,question_1_target,Python
+t,460.0,480.12,15.0,22,4,0,question_1_target,Python
+h,475.0,480.12,15.0,22,5,0,question_1_target,Python
+o,490.0,480.12,15.0,22,6,0,question_1_target,Python
+n,505.0,480.12,15.0,22,7,0,question_1_target,Python
+ ,520.0,480.12,15.0,22,8,0,question_1_target,
+p,535.0,480.12,15.0,22,9,0,question_1_target,package
+a,550.0,480.12,15.0,22,10,0,question_1_target,package
+c,565.0,480.12,15.0,22,11,0,question_1_target,package
+k,580.0,480.12,15.0,22,12,0,question_1_target,package
+a,595.0,480.12,15.0,22,13,0,question_1_target,package
+g,610.0,480.12,15.0,22,14,0,question_1_target,package
+e,625.0,480.12,15.0,22,15,0,question_1_target,package
+A,518.9,789.5,14.941176470588236,23,0,0,question_1_distractor_1,A
+ ,533.8411764705883,789.5,14.941176470588236,23,1,0,question_1_distractor_1,
+p,548.7823529411764,789.5,14.941176470588236,23,2,0,question_1_distractor_1,plotting
+l,563.7235294117647,789.5,14.941176470588236,23,3,0,question_1_distractor_1,plotting
+o,578.664705882353,789.5,14.941176470588236,23,4,0,question_1_distractor_1,plotting
+t,593.6058823529412,789.5,14.941176470588236,23,5,0,question_1_distractor_1,plotting
+t,608.5470588235294,789.5,14.941176470588236,23,6,0,question_1_distractor_1,plotting
+i,623.4882352941177,789.5,14.941176470588236,23,7,0,question_1_distractor_1,plotting
+n,638.429411764706,789.5,14.941176470588236,23,8,0,question_1_distractor_1,plotting
+g,653.3705882352941,789.5,14.941176470588236,23,9,0,question_1_distractor_1,plotting
+ ,668.3117647058823,789.5,14.941176470588236,23,10,0,question_1_distractor_1,
+m,683.2529411764706,789.5,14.941176470588236,23,11,0,question_1_distractor_1,method
+e,698.1941176470589,789.5,14.941176470588236,23,12,0,question_1_distractor_1,method
+t,713.135294117647,789.5,14.941176470588236,23,13,0,question_1_distractor_1,method
+h,728.0764705882352,789.5,14.941176470588236,23,14,0,question_1_distractor_1,method
+o,743.0176470588235,789.5,14.941176470588236,23,15,0,question_1_distractor_1,method
+d,757.9588235294118,789.5,14.941176470588236,23,16,0,question_1_distractor_1,method
+A,518.9,290.5,15.0,23,0,0,question_1_distractor_2,A
+ ,533.9,290.5,15.0,23,1,0,question_1_distractor_2,
+J,548.9,290.5,15.0,23,2,0,question_1_distractor_2,Java
+a,563.9,290.5,15.0,23,3,0,question_1_distractor_2,Java
+v,578.9,290.5,15.0,23,4,0,question_1_distractor_2,Java
+a,593.9,290.5,15.0,23,5,0,question_1_distractor_2,Java
+ ,608.9,290.5,15.0,23,6,0,question_1_distractor_2,
+s,623.9,290.5,15.0,23,7,0,question_1_distractor_2,script
+c,638.9,290.5,15.0,23,8,0,question_1_distractor_2,script
+r,653.9,290.5,15.0,23,9,0,question_1_distractor_2,script
+i,668.9,290.5,15.0,23,10,0,question_1_distractor_2,script
+p,683.9,290.5,15.0,23,11,0,question_1_distractor_2,script
+t,698.9,290.5,15.0,23,12,0,question_1_distractor_2,script
+A,1084.2199999999998,480.12,15.0,19,0,0,question_1_distractor_3,A
+ ,1099.2199999999998,480.12,15.0,19,1,0,question_1_distractor_3,
+t,1114.2199999999998,480.12,15.0,19,2,0,question_1_distractor_3,test
+e,1129.2199999999998,480.12,15.0,19,3,0,question_1_distractor_3,test
+s,1144.2199999999998,480.12,15.0,19,4,0,question_1_distractor_3,test
+t,1159.2199999999998,480.12,15.0,19,5,0,question_1_distractor_3,test
+ ,1174.2199999999998,480.12,15.0,19,6,0,question_1_distractor_3,
+s,1189.2199999999998,480.12,15.0,19,7,0,question_1_distractor_3,suite
+u,1204.2199999999998,480.12,15.0,19,8,0,question_1_distractor_3,suite
+i,1219.2199999999998,480.12,15.0,19,9,0,question_1_distractor_3,suite
+t,1234.2199999999998,480.12,15.0,19,10,0,question_1_distractor_3,suite
+e,1249.2199999999998,480.12,15.0,19,11,0,question_1_distractor_3,suite
+p,400.0,122.0,15.0,22,0,0,page_1,pymovements
+y,415.0,122.0,15.0,22,1,0,page_1,pymovements
+m,430.0,122.0,15.0,22,2,0,page_1,pymovements
+o,445.0,122.0,15.0,22,3,0,page_1,pymovements
+v,460.0,122.0,15.0,22,4,0,page_1,pymovements
+e,475.0,122.0,15.0,22,5,0,page_1,pymovements
+m,490.0,122.0,15.0,22,6,0,page_1,pymovements
+e,505.0,122.0,15.0,22,7,0,page_1,pymovements
+n,520.0,122.0,15.0,22,8,0,page_1,pymovements
+t,535.0,122.0,15.0,22,9,0,page_1,pymovements
+s,550.0,122.0,15.0,22,10,0,page_1,pymovements
+A,400.0,122.0,15.0,18,0,0,page_2,ABSTRACT
+B,415.0,122.0,15.0,18,1,0,page_2,ABSTRACT
+S,430.0,122.0,15.0,18,2,0,page_2,ABSTRACT
+T,445.0,122.0,15.0,18,3,0,page_2,ABSTRACT
+R,460.0,122.0,15.0,18,4,0,page_2,ABSTRACT
+A,475.0,122.0,15.0,18,5,0,page_2,ABSTRACT
+C,490.0,122.0,15.0,18,6,0,page_2,ABSTRACT
+T,505.0,122.0,15.0,18,7,0,page_2,ABSTRACT
+p,400.0,214.85148514851485,14.972602739726028,23,0,1,page_2,pymovements:
+y,414.972602739726,214.85148514851485,14.972602739726028,23,1,1,page_2,pymovements:
+m,429.94520547945206,214.85148514851485,14.972602739726028,23,2,1,page_2,pymovements:
+o,444.9178082191781,214.85148514851485,14.972602739726028,23,3,1,page_2,pymovements:
+v,459.8904109589041,214.85148514851485,14.972602739726028,23,4,1,page_2,pymovements:
+e,474.86301369863014,214.85148514851485,14.972602739726028,23,5,1,page_2,pymovements:
+m,489.83561643835617,214.85148514851485,14.972602739726028,23,6,1,page_2,pymovements:
+e,504.8082191780822,214.85148514851485,14.972602739726028,23,7,1,page_2,pymovements:
+n,519.7808219178082,214.85148514851485,14.972602739726028,23,8,1,page_2,pymovements:
+t,534.7534246575342,214.85148514851485,14.972602739726028,23,9,1,page_2,pymovements:
+s,549.7260273972603,214.85148514851485,14.972602739726028,23,10,1,page_2,pymovements:
+:,564.6986301369864,214.85148514851485,14.972602739726028,23,11,1,page_2,pymovements:
+ ,579.6712328767123,214.85148514851485,14.972602739726028,23,12,1,page_2,
+A,594.6438356164383,214.85148514851485,14.972602739726028,23,13,1,page_2,A
+ ,609.6164383561644,214.85148514851485,14.972602739726028,23,14,1,page_2,
+P,624.5890410958905,214.85148514851485,14.972602739726028,23,15,1,page_2,Python
+y,639.5616438356165,214.85148514851485,14.972602739726028,23,16,1,page_2,Python
+t,654.5342465753424,214.85148514851485,14.972602739726028,23,17,1,page_2,Python
+h,669.5068493150685,214.85148514851485,14.972602739726028,23,18,1,page_2,Python
+o,684.4794520547946,214.85148514851485,14.972602739726028,23,19,1,page_2,Python
+n,699.4520547945206,214.85148514851485,14.972602739726028,23,20,1,page_2,Python
+ ,714.4246575342465,214.85148514851485,14.972602739726028,23,21,1,page_2,
+p,729.3972602739726,214.85148514851485,14.972602739726028,23,22,1,page_2,package
+a,744.3698630136987,214.85148514851485,14.972602739726028,23,23,1,page_2,package
+c,759.3424657534247,214.85148514851485,14.972602739726028,23,24,1,page_2,package
+k,774.3150684931506,214.85148514851485,14.972602739726028,23,25,1,page_2,package
+a,789.2876712328767,214.85148514851485,14.972602739726028,23,26,1,page_2,package
+g,804.2602739726028,214.85148514851485,14.972602739726028,23,27,1,page_2,package
+e,819.2328767123288,214.85148514851485,14.972602739726028,23,28,1,page_2,package
+ ,834.2054794520548,214.85148514851485,14.972602739726028,23,29,1,page_2,
+f,849.1780821917807,214.85148514851485,14.972602739726028,23,30,1,page_2,for
+o,864.1506849315067,214.85148514851485,14.972602739726028,23,31,1,page_2,for
+r,879.1232876712327,214.85148514851485,14.972602739726028,23,32,1,page_2,for
+ ,894.0958904109586,214.85148514851485,14.972602739726028,23,33,1,page_2,
+e,909.0684931506846,214.85148514851485,14.972602739726028,23,34,1,page_2,eye
+y,924.0410958904106,214.85148514851485,14.972602739726028,23,35,1,page_2,eye
+e,939.0136986301366,214.85148514851485,14.972602739726028,23,36,1,page_2,eye
+ ,953.9863013698625,214.85148514851485,14.972602739726028,23,37,1,page_2,
+m,968.9589041095885,214.85148514851485,14.972602739726028,23,38,1,page_2,movement
+o,983.9315068493145,214.85148514851485,14.972602739726028,23,39,1,page_2,movement
+v,998.9041095890404,214.85148514851485,14.972602739726028,23,40,1,page_2,movement
+e,1013.8767123287664,214.85148514851485,14.972602739726028,23,41,1,page_2,movement
+m,1028.8493150684924,214.85148514851485,14.972602739726028,23,42,1,page_2,movement
+e,1043.8219178082184,214.85148514851485,14.972602739726028,23,43,1,page_2,movement
+n,1058.7945205479443,214.85148514851485,14.972602739726028,23,44,1,page_2,movement
+t,1073.7671232876703,214.85148514851485,14.972602739726028,23,45,1,page_2,movement
+ ,1088.7397260273963,214.85148514851485,14.972602739726028,23,46,1,page_2,
+d,1103.7123287671222,214.85148514851485,14.972602739726028,23,47,1,page_2,data
+a,1118.6849315068482,214.85148514851485,14.972602739726028,23,48,1,page_2,data
+t,1133.6575342465742,214.85148514851485,14.972602739726028,23,49,1,page_2,data
+a,1148.6301369863002,214.85148514851485,14.972602739726028,23,50,1,page_2,data
+ ,1163.6027397260261,214.85148514851485,14.972602739726028,23,51,1,page_2,
+p,1178.575342465752,214.85148514851485,14.972602739726028,23,52,1,page_2,"processing,"
+r,1193.547945205478,214.85148514851485,14.972602739726028,23,53,1,page_2,"processing,"
+o,1208.520547945204,214.85148514851485,14.972602739726028,23,54,1,page_2,"processing,"
+c,1223.49315068493,214.85148514851485,14.972602739726028,23,55,1,page_2,"processing,"
+e,1238.465753424656,214.85148514851485,14.972602739726028,23,56,1,page_2,"processing,"
+s,1253.438356164382,214.85148514851485,14.972602739726028,23,57,1,page_2,"processing,"
+s,1268.410958904108,214.85148514851485,14.972602739726028,23,58,1,page_2,"processing,"
+i,1283.383561643834,214.85148514851485,14.972602739726028,23,59,1,page_2,"processing,"
+n,1298.3561643835599,214.85148514851485,14.972602739726028,23,60,1,page_2,"processing,"
+g,1313.3287671232858,214.85148514851485,14.972602739726028,23,61,1,page_2,"processing,"
+",",1328.3013698630118,214.85148514851485,14.972602739726028,23,62,1,page_2,"processing,"
+ ,1343.2739726027378,214.85148514851485,14.972602739726028,23,63,1,page_2,
+E,1358.2465753424638,214.85148514851485,14.972602739726028,23,64,1,page_2,ETRA
+T,1373.2191780821897,214.85148514851485,14.972602739726028,23,65,1,page_2,ETRA
+R,1388.1917808219157,214.85148514851485,14.972602739726028,23,66,1,page_2,ETRA
+A,1403.1643835616417,214.85148514851485,14.972602739726028,23,67,1,page_2,ETRA
+ ,1418.1369863013676,214.85148514851485,14.972602739726028,23,68,1,page_2,
+2,1433.1095890410936,214.85148514851485,14.972602739726028,23,69,1,page_2,2023
+0,1448.0821917808196,214.85148514851485,14.972602739726028,23,70,1,page_2,2023
+2,1463.0547945205456,214.85148514851485,14.972602739726028,23,71,1,page_2,2023
+3,1478.0273972602715,214.85148514851485,14.972602739726028,23,72,1,page_2,2023
+W,400.0,122.0,14.974683544303797,23,0,0,page_3,We
+e,414.9746835443038,122.0,14.974683544303797,23,1,0,page_3,We
+ ,429.9493670886076,122.0,14.974683544303797,23,2,0,page_3,
+i,444.9240506329114,122.0,14.974683544303797,23,3,0,page_3,introduce
+n,459.8987341772152,122.0,14.974683544303797,23,4,0,page_3,introduce
+t,474.873417721519,122.0,14.974683544303797,23,5,0,page_3,introduce
+r,489.8481012658228,122.0,14.974683544303797,23,6,0,page_3,introduce
+o,504.82278481012656,122.0,14.974683544303797,23,7,0,page_3,introduce
+d,519.7974683544303,122.0,14.974683544303797,23,8,0,page_3,introduce
+u,534.7721518987341,122.0,14.974683544303797,23,9,0,page_3,introduce
+c,549.746835443038,122.0,14.974683544303797,23,10,0,page_3,introduce
+e,564.7215189873417,122.0,14.974683544303797,23,11,0,page_3,introduce
+ ,579.6962025316454,122.0,14.974683544303797,23,12,0,page_3,
+p,594.6708860759493,122.0,14.974683544303797,23,13,0,page_3,pymovements:
+y,609.6455696202531,122.0,14.974683544303797,23,14,0,page_3,pymovements:
+m,624.6202531645569,122.0,14.974683544303797,23,15,0,page_3,pymovements:
+o,639.5949367088606,122.0,14.974683544303797,23,16,0,page_3,pymovements:
+v,654.5696202531644,122.0,14.974683544303797,23,17,0,page_3,pymovements:
+e,669.5443037974683,122.0,14.974683544303797,23,18,0,page_3,pymovements:
+m,684.518987341772,122.0,14.974683544303797,23,19,0,page_3,pymovements:
+e,699.4936708860757,122.0,14.974683544303797,23,20,0,page_3,pymovements:
+n,714.4683544303796,122.0,14.974683544303797,23,21,0,page_3,pymovements:
+t,729.4430379746834,122.0,14.974683544303797,23,22,0,page_3,pymovements:
+s,744.4177215189872,122.0,14.974683544303797,23,23,0,page_3,pymovements:
+:,759.3924050632909,122.0,14.974683544303797,23,24,0,page_3,pymovements:
+ ,774.3670886075947,122.0,14.974683544303797,23,25,0,page_3,
+a,789.3417721518986,122.0,14.974683544303797,23,26,0,page_3,a
+ ,804.3164556962023,122.0,14.974683544303797,23,27,0,page_3,
+P,819.291139240506,122.0,14.974683544303797,23,28,0,page_3,Python
+y,834.2658227848099,122.0,14.974683544303797,23,29,0,page_3,Python
+t,849.2405063291137,122.0,14.974683544303797,23,30,0,page_3,Python
+h,864.2151898734176,122.0,14.974683544303797,23,31,0,page_3,Python
+o,879.1898734177214,122.0,14.974683544303797,23,32,0,page_3,Python
+n,894.1645569620252,122.0,14.974683544303797,23,33,0,page_3,Python
+ ,909.1392405063291,122.0,14.974683544303797,23,34,0,page_3,
+p,924.1139240506329,122.0,14.974683544303797,23,35,0,page_3,package
+a,939.0886075949368,122.0,14.974683544303797,23,36,0,page_3,package
+c,954.0632911392406,122.0,14.974683544303797,23,37,0,page_3,package
+k,969.0379746835445,122.0,14.974683544303797,23,38,0,page_3,package
+a,984.0126582278483,122.0,14.974683544303797,23,39,0,page_3,package
+g,998.9873417721521,122.0,14.974683544303797,23,40,0,page_3,package
+e,1013.962025316456,122.0,14.974683544303797,23,41,0,page_3,package
+ ,1028.9367088607598,122.0,14.974683544303797,23,42,0,page_3,
+f,1043.9113924050637,122.0,14.974683544303797,23,43,0,page_3,for
+o,1058.8860759493675,122.0,14.974683544303797,23,44,0,page_3,for
+r,1073.8607594936714,122.0,14.974683544303797,23,45,0,page_3,for
+ ,1088.8354430379752,122.0,14.974683544303797,23,46,0,page_3,
+a,1103.810126582279,122.0,14.974683544303797,23,47,0,page_3,analyzing
+n,1118.784810126583,122.0,14.974683544303797,23,48,0,page_3,analyzing
+a,1133.7594936708867,122.0,14.974683544303797,23,49,0,page_3,analyzing
+l,1148.7341772151906,122.0,14.974683544303797,23,50,0,page_3,analyzing
+y,1163.7088607594944,122.0,14.974683544303797,23,51,0,page_3,analyzing
+z,1178.6835443037983,122.0,14.974683544303797,23,52,0,page_3,analyzing
+i,1193.6582278481021,122.0,14.974683544303797,23,53,0,page_3,analyzing
+n,1208.632911392406,122.0,14.974683544303797,23,54,0,page_3,analyzing
+g,1223.6075949367098,122.0,14.974683544303797,23,55,0,page_3,analyzing
+ ,1238.5822784810136,122.0,14.974683544303797,23,56,0,page_3,
+e,1253.5569620253175,122.0,14.974683544303797,23,57,0,page_3,eye-tracking
+y,1268.5316455696213,122.0,14.974683544303797,23,58,0,page_3,eye-tracking
+e,1283.5063291139252,122.0,14.974683544303797,23,59,0,page_3,eye-tracking
+-,1298.481012658229,122.0,14.974683544303797,23,60,0,page_3,eye-tracking
+t,1313.4556962025329,122.0,14.974683544303797,23,61,0,page_3,eye-tracking
+r,1328.4303797468367,122.0,14.974683544303797,23,62,0,page_3,eye-tracking
+a,1343.4050632911406,122.0,14.974683544303797,23,63,0,page_3,eye-tracking
+c,1358.3797468354444,122.0,14.974683544303797,23,64,0,page_3,eye-tracking
+k,1373.3544303797482,122.0,14.974683544303797,23,65,0,page_3,eye-tracking
+i,1388.329113924052,122.0,14.974683544303797,23,66,0,page_3,eye-tracking
+n,1403.303797468356,122.0,14.974683544303797,23,67,0,page_3,eye-tracking
+g,1418.2784810126598,122.0,14.974683544303797,23,68,0,page_3,eye-tracking
+ ,1433.2531645569636,122.0,14.974683544303797,23,69,0,page_3,
+d,1448.2278481012675,122.0,14.974683544303797,23,70,0,page_3,data
+a,1463.2025316455713,122.0,14.974683544303797,23,71,0,page_3,data
+t,1478.1772151898751,122.0,14.974683544303797,23,72,0,page_3,data
+a,1493.151898734179,122.0,14.974683544303797,23,73,0,page_3,data
+ ,1508.1265822784828,122.0,14.974683544303797,23,74,0,page_3,
+t,1523.1012658227867,122.0,14.974683544303797,23,75,0,page_3,that
+h,1538.0759493670905,122.0,14.974683544303797,23,76,0,page_3,that
+a,1553.0506329113944,122.0,14.974683544303797,23,77,0,page_3,that
+t,1568.0253164556982,122.0,14.974683544303797,23,78,0,page_3,that
+f,400.0,219.85148514851485,14.974358974358974,23,0,1,page_3,follows
+o,414.974358974359,219.85148514851485,14.974358974358974,23,1,1,page_3,follows
+l,429.94871794871796,219.85148514851485,14.974358974358974,23,2,1,page_3,follows
+l,444.9230769230769,219.85148514851485,14.974358974358974,23,3,1,page_3,follows
+o,459.8974358974359,219.85148514851485,14.974358974358974,23,4,1,page_3,follows
+w,474.8717948717949,219.85148514851485,14.974358974358974,23,5,1,page_3,follows
+s,489.84615384615387,219.85148514851485,14.974358974358974,23,6,1,page_3,follows
+ ,504.8205128205128,219.85148514851485,14.974358974358974,23,7,1,page_3,
+b,519.7948717948718,219.85148514851485,14.974358974358974,23,8,1,page_3,best
+e,534.7692307692308,219.85148514851485,14.974358974358974,23,9,1,page_3,best
+s,549.7435897435898,219.85148514851485,14.974358974358974,23,10,1,page_3,best
+t,564.7179487179487,219.85148514851485,14.974358974358974,23,11,1,page_3,best
+ ,579.6923076923077,219.85148514851485,14.974358974358974,23,12,1,page_3,
+p,594.6666666666667,219.85148514851485,14.974358974358974,23,13,1,page_3,practices
+r,609.6410256410256,219.85148514851485,14.974358974358974,23,14,1,page_3,practices
+a,624.6153846153845,219.85148514851485,14.974358974358974,23,15,1,page_3,practices
+c,639.5897435897435,219.85148514851485,14.974358974358974,23,16,1,page_3,practices
+t,654.5641025641025,219.85148514851485,14.974358974358974,23,17,1,page_3,practices
+i,669.5384615384614,219.85148514851485,14.974358974358974,23,18,1,page_3,practices
+c,684.5128205128203,219.85148514851485,14.974358974358974,23,19,1,page_3,practices
+e,699.4871794871793,219.85148514851485,14.974358974358974,23,20,1,page_3,practices
+s,714.4615384615383,219.85148514851485,14.974358974358974,23,21,1,page_3,practices
+ ,729.4358974358972,219.85148514851485,14.974358974358974,23,22,1,page_3,
+i,744.4102564102561,219.85148514851485,14.974358974358974,23,23,1,page_3,in
+n,759.3846153846151,219.85148514851485,14.974358974358974,23,24,1,page_3,in
+ ,774.3589743589741,219.85148514851485,14.974358974358974,23,25,1,page_3,
+s,789.333333333333,219.85148514851485,14.974358974358974,23,26,1,page_3,software
+o,804.3076923076919,219.85148514851485,14.974358974358974,23,27,1,page_3,software
+f,819.2820512820509,219.85148514851485,14.974358974358974,23,28,1,page_3,software
+t,834.2564102564099,219.85148514851485,14.974358974358974,23,29,1,page_3,software
+w,849.2307692307689,219.85148514851485,14.974358974358974,23,30,1,page_3,software
+a,864.205128205128,219.85148514851485,14.974358974358974,23,31,1,page_3,software
+r,879.179487179487,219.85148514851485,14.974358974358974,23,32,1,page_3,software
+e,894.153846153846,219.85148514851485,14.974358974358974,23,33,1,page_3,software
+ ,909.128205128205,219.85148514851485,14.974358974358974,23,34,1,page_3,
+d,924.102564102564,219.85148514851485,14.974358974358974,23,35,1,page_3,"development,"
+e,939.076923076923,219.85148514851485,14.974358974358974,23,36,1,page_3,"development,"
+v,954.051282051282,219.85148514851485,14.974358974358974,23,37,1,page_3,"development,"
+e,969.025641025641,219.85148514851485,14.974358974358974,23,38,1,page_3,"development,"
+l,984.0,219.85148514851485,14.974358974358974,23,39,1,page_3,"development,"
+o,998.974358974359,219.85148514851485,14.974358974358974,23,40,1,page_3,"development,"
+p,1013.948717948718,219.85148514851485,14.974358974358974,23,41,1,page_3,"development,"
+m,1028.9230769230771,219.85148514851485,14.974358974358974,23,42,1,page_3,"development,"
+e,1043.897435897436,219.85148514851485,14.974358974358974,23,43,1,page_3,"development,"
+n,1058.871794871795,219.85148514851485,14.974358974358974,23,44,1,page_3,"development,"
+t,1073.846153846154,219.85148514851485,14.974358974358974,23,45,1,page_3,"development,"
+",",1088.8205128205132,219.85148514851485,14.974358974358974,23,46,1,page_3,"development,"
+ ,1103.794871794872,219.85148514851485,14.974358974358974,23,47,1,page_3,
+i,1118.769230769231,219.85148514851485,14.974358974358974,23,48,1,page_3,including
+n,1133.74358974359,219.85148514851485,14.974358974358974,23,49,1,page_3,including
+c,1148.7179487179492,219.85148514851485,14.974358974358974,23,50,1,page_3,including
+l,1163.692307692308,219.85148514851485,14.974358974358974,23,51,1,page_3,including
+u,1178.666666666667,219.85148514851485,14.974358974358974,23,52,1,page_3,including
+d,1193.641025641026,219.85148514851485,14.974358974358974,23,53,1,page_3,including
+i,1208.6153846153852,219.85148514851485,14.974358974358974,23,54,1,page_3,including
+n,1223.589743589744,219.85148514851485,14.974358974358974,23,55,1,page_3,including
+g,1238.564102564103,219.85148514851485,14.974358974358974,23,56,1,page_3,including
+ ,1253.5384615384621,219.85148514851485,14.974358974358974,23,57,1,page_3,
+r,1268.5128205128212,219.85148514851485,14.974358974358974,23,58,1,page_3,rigorous
+i,1283.4871794871801,219.85148514851485,14.974358974358974,23,59,1,page_3,rigorous
+g,1298.461538461539,219.85148514851485,14.974358974358974,23,60,1,page_3,rigorous
+o,1313.4358974358981,219.85148514851485,14.974358974358974,23,61,1,page_3,rigorous
+r,1328.4102564102573,219.85148514851485,14.974358974358974,23,62,1,page_3,rigorous
+o,1343.3846153846162,219.85148514851485,14.974358974358974,23,63,1,page_3,rigorous
+u,1358.358974358975,219.85148514851485,14.974358974358974,23,64,1,page_3,rigorous
+s,1373.333333333334,219.85148514851485,14.974358974358974,23,65,1,page_3,rigorous
+ ,1388.3076923076928,219.85148514851485,14.974358974358974,23,66,1,page_3,
+t,1403.2820512820517,219.85148514851485,14.974358974358974,23,67,1,page_3,testing
+e,1418.2564102564106,219.85148514851485,14.974358974358974,23,68,1,page_3,testing
+s,1433.2307692307695,219.85148514851485,14.974358974358974,23,69,1,page_3,testing
+t,1448.2051282051284,219.85148514851485,14.974358974358974,23,70,1,page_3,testing
+i,1463.1794871794873,219.85148514851485,14.974358974358974,23,71,1,page_3,testing
+n,1478.1538461538462,219.85148514851485,14.974358974358974,23,72,1,page_3,testing
+g,1493.128205128205,219.85148514851485,14.974358974358974,23,73,1,page_3,testing
+ ,1508.102564102564,219.85148514851485,14.974358974358974,23,74,1,page_3,
+a,1523.0769230769229,219.85148514851485,14.974358974358974,23,75,1,page_3,and
+n,1538.0512820512818,219.85148514851485,14.974358974358974,23,76,1,page_3,and
+d,1553.0256410256407,219.85148514851485,14.974358974358974,23,77,1,page_3,and
+a,400.0,317.7029702970297,14.972602739726028,23,0,2,page_3,adherence
+d,414.972602739726,317.7029702970297,14.972602739726028,23,1,2,page_3,adherence
+h,429.94520547945206,317.7029702970297,14.972602739726028,23,2,2,page_3,adherence
+e,444.9178082191781,317.7029702970297,14.972602739726028,23,3,2,page_3,adherence
+r,459.8904109589041,317.7029702970297,14.972602739726028,23,4,2,page_3,adherence
+e,474.86301369863014,317.7029702970297,14.972602739726028,23,5,2,page_3,adherence
+n,489.83561643835617,317.7029702970297,14.972602739726028,23,6,2,page_3,adherence
+c,504.8082191780822,317.7029702970297,14.972602739726028,23,7,2,page_3,adherence
+e,519.7808219178082,317.7029702970297,14.972602739726028,23,8,2,page_3,adherence
+ ,534.7534246575342,317.7029702970297,14.972602739726028,23,9,2,page_3,
+t,549.7260273972603,317.7029702970297,14.972602739726028,23,10,2,page_3,to
+o,564.6986301369864,317.7029702970297,14.972602739726028,23,11,2,page_3,to
+ ,579.6712328767123,317.7029702970297,14.972602739726028,23,12,2,page_3,
+c,594.6438356164383,317.7029702970297,14.972602739726028,23,13,2,page_3,coding
+o,609.6164383561644,317.7029702970297,14.972602739726028,23,14,2,page_3,coding
+d,624.5890410958905,317.7029702970297,14.972602739726028,23,15,2,page_3,coding
+i,639.5616438356165,317.7029702970297,14.972602739726028,23,16,2,page_3,coding
+n,654.5342465753424,317.7029702970297,14.972602739726028,23,17,2,page_3,coding
+g,669.5068493150685,317.7029702970297,14.972602739726028,23,18,2,page_3,coding
+ ,684.4794520547946,317.7029702970297,14.972602739726028,23,19,2,page_3,
+s,699.4520547945206,317.7029702970297,14.972602739726028,23,20,2,page_3,standards.
+t,714.4246575342465,317.7029702970297,14.972602739726028,23,21,2,page_3,standards.
+a,729.3972602739726,317.7029702970297,14.972602739726028,23,22,2,page_3,standards.
+n,744.3698630136987,317.7029702970297,14.972602739726028,23,23,2,page_3,standards.
+d,759.3424657534247,317.7029702970297,14.972602739726028,23,24,2,page_3,standards.
+a,774.3150684931506,317.7029702970297,14.972602739726028,23,25,2,page_3,standards.
+r,789.2876712328767,317.7029702970297,14.972602739726028,23,26,2,page_3,standards.
+d,804.2602739726028,317.7029702970297,14.972602739726028,23,27,2,page_3,standards.
+s,819.2328767123288,317.7029702970297,14.972602739726028,23,28,2,page_3,standards.
+.,834.2054794520548,317.7029702970297,14.972602739726028,23,29,2,page_3,standards.
+ ,849.1780821917807,317.7029702970297,14.972602739726028,23,30,2,page_3,
+T,864.1506849315067,317.7029702970297,14.972602739726028,23,31,2,page_3,The
+h,879.1232876712327,317.7029702970297,14.972602739726028,23,32,2,page_3,The
+e,894.0958904109586,317.7029702970297,14.972602739726028,23,33,2,page_3,The
+ ,909.0684931506846,317.7029702970297,14.972602739726028,23,34,2,page_3,
+p,924.0410958904106,317.7029702970297,14.972602739726028,23,35,2,page_3,package
+a,939.0136986301366,317.7029702970297,14.972602739726028,23,36,2,page_3,package
+c,953.9863013698625,317.7029702970297,14.972602739726028,23,37,2,page_3,package
+k,968.9589041095885,317.7029702970297,14.972602739726028,23,38,2,page_3,package
+a,983.9315068493145,317.7029702970297,14.972602739726028,23,39,2,page_3,package
+g,998.9041095890404,317.7029702970297,14.972602739726028,23,40,2,page_3,package
+e,1013.8767123287664,317.7029702970297,14.972602739726028,23,41,2,page_3,package
+ ,1028.8493150684924,317.7029702970297,14.972602739726028,23,42,2,page_3,
+p,1043.8219178082184,317.7029702970297,14.972602739726028,23,43,2,page_3,provides
+r,1058.7945205479443,317.7029702970297,14.972602739726028,23,44,2,page_3,provides
+o,1073.7671232876703,317.7029702970297,14.972602739726028,23,45,2,page_3,provides
+v,1088.7397260273963,317.7029702970297,14.972602739726028,23,46,2,page_3,provides
+i,1103.7123287671222,317.7029702970297,14.972602739726028,23,47,2,page_3,provides
+d,1118.6849315068482,317.7029702970297,14.972602739726028,23,48,2,page_3,provides
+e,1133.6575342465742,317.7029702970297,14.972602739726028,23,49,2,page_3,provides
+s,1148.6301369863002,317.7029702970297,14.972602739726028,23,50,2,page_3,provides
+ ,1163.6027397260261,317.7029702970297,14.972602739726028,23,51,2,page_3,
+f,1178.575342465752,317.7029702970297,14.972602739726028,23,52,2,page_3,functionality
+u,1193.547945205478,317.7029702970297,14.972602739726028,23,53,2,page_3,functionality
+n,1208.520547945204,317.7029702970297,14.972602739726028,23,54,2,page_3,functionality
+c,1223.49315068493,317.7029702970297,14.972602739726028,23,55,2,page_3,functionality
+t,1238.465753424656,317.7029702970297,14.972602739726028,23,56,2,page_3,functionality
+i,1253.438356164382,317.7029702970297,14.972602739726028,23,57,2,page_3,functionality
+o,1268.410958904108,317.7029702970297,14.972602739726028,23,58,2,page_3,functionality
+n,1283.383561643834,317.7029702970297,14.972602739726028,23,59,2,page_3,functionality
+a,1298.3561643835599,317.7029702970297,14.972602739726028,23,60,2,page_3,functionality
+l,1313.3287671232858,317.7029702970297,14.972602739726028,23,61,2,page_3,functionality
+i,1328.3013698630118,317.7029702970297,14.972602739726028,23,62,2,page_3,functionality
+t,1343.2739726027378,317.7029702970297,14.972602739726028,23,63,2,page_3,functionality
+y,1358.2465753424638,317.7029702970297,14.972602739726028,23,64,2,page_3,functionality
+ ,1373.2191780821897,317.7029702970297,14.972602739726028,23,65,2,page_3,
+f,1388.1917808219157,317.7029702970297,14.972602739726028,23,66,2,page_3,for
+o,1403.1643835616417,317.7029702970297,14.972602739726028,23,67,2,page_3,for
+r,1418.1369863013676,317.7029702970297,14.972602739726028,23,68,2,page_3,for
+ ,1433.1095890410936,317.7029702970297,14.972602739726028,23,69,2,page_3,
+k,1448.0821917808196,317.7029702970297,14.972602739726028,23,70,2,page_3,key
+e,1463.0547945205456,317.7029702970297,14.972602739726028,23,71,2,page_3,key
+y,1478.0273972602715,317.7029702970297,14.972602739726028,23,72,2,page_3,key
+p,400.0,415.5544554455446,14.974683544303797,23,0,3,page_3,processes
+r,414.9746835443038,415.5544554455446,14.974683544303797,23,1,3,page_3,processes
+o,429.9493670886076,415.5544554455446,14.974683544303797,23,2,3,page_3,processes
+c,444.9240506329114,415.5544554455446,14.974683544303797,23,3,3,page_3,processes
+e,459.8987341772152,415.5544554455446,14.974683544303797,23,4,3,page_3,processes
+s,474.873417721519,415.5544554455446,14.974683544303797,23,5,3,page_3,processes
+s,489.8481012658228,415.5544554455446,14.974683544303797,23,6,3,page_3,processes
+e,504.82278481012656,415.5544554455446,14.974683544303797,23,7,3,page_3,processes
+s,519.7974683544303,415.5544554455446,14.974683544303797,23,8,3,page_3,processes
+ ,534.7721518987341,415.5544554455446,14.974683544303797,23,9,3,page_3,
+a,549.746835443038,415.5544554455446,14.974683544303797,23,10,3,page_3,along
+l,564.7215189873417,415.5544554455446,14.974683544303797,23,11,3,page_3,along
+o,579.6962025316454,415.5544554455446,14.974683544303797,23,12,3,page_3,along
+n,594.6708860759493,415.5544554455446,14.974683544303797,23,13,3,page_3,along
+g,609.6455696202531,415.5544554455446,14.974683544303797,23,14,3,page_3,along
+ ,624.6202531645569,415.5544554455446,14.974683544303797,23,15,3,page_3,
+t,639.5949367088606,415.5544554455446,14.974683544303797,23,16,3,page_3,the
+h,654.5696202531644,415.5544554455446,14.974683544303797,23,17,3,page_3,the
+e,669.5443037974683,415.5544554455446,14.974683544303797,23,18,3,page_3,the
+ ,684.518987341772,415.5544554455446,14.974683544303797,23,19,3,page_3,
+e,699.4936708860757,415.5544554455446,14.974683544303797,23,20,3,page_3,entire
+n,714.4683544303796,415.5544554455446,14.974683544303797,23,21,3,page_3,entire
+t,729.4430379746834,415.5544554455446,14.974683544303797,23,22,3,page_3,entire
+i,744.4177215189872,415.5544554455446,14.974683544303797,23,23,3,page_3,entire
+r,759.3924050632909,415.5544554455446,14.974683544303797,23,24,3,page_3,entire
+e,774.3670886075947,415.5544554455446,14.974683544303797,23,25,3,page_3,entire
+ ,789.3417721518986,415.5544554455446,14.974683544303797,23,26,3,page_3,
+p,804.3164556962023,415.5544554455446,14.974683544303797,23,27,3,page_3,preprocessing
+r,819.291139240506,415.5544554455446,14.974683544303797,23,28,3,page_3,preprocessing
+e,834.2658227848099,415.5544554455446,14.974683544303797,23,29,3,page_3,preprocessing
+p,849.2405063291137,415.5544554455446,14.974683544303797,23,30,3,page_3,preprocessing
+r,864.2151898734176,415.5544554455446,14.974683544303797,23,31,3,page_3,preprocessing
+o,879.1898734177214,415.5544554455446,14.974683544303797,23,32,3,page_3,preprocessing
+c,894.1645569620252,415.5544554455446,14.974683544303797,23,33,3,page_3,preprocessing
+e,909.1392405063291,415.5544554455446,14.974683544303797,23,34,3,page_3,preprocessing
+s,924.1139240506329,415.5544554455446,14.974683544303797,23,35,3,page_3,preprocessing
+s,939.0886075949368,415.5544554455446,14.974683544303797,23,36,3,page_3,preprocessing
+i,954.0632911392406,415.5544554455446,14.974683544303797,23,37,3,page_3,preprocessing
+n,969.0379746835445,415.5544554455446,14.974683544303797,23,38,3,page_3,preprocessing
+g,984.0126582278483,415.5544554455446,14.974683544303797,23,39,3,page_3,preprocessing
+ ,998.9873417721521,415.5544554455446,14.974683544303797,23,40,3,page_3,
+p,1013.962025316456,415.5544554455446,14.974683544303797,23,41,3,page_3,pipeline.
+i,1028.9367088607598,415.5544554455446,14.974683544303797,23,42,3,page_3,pipeline.
+p,1043.9113924050637,415.5544554455446,14.974683544303797,23,43,3,page_3,pipeline.
+e,1058.8860759493675,415.5544554455446,14.974683544303797,23,44,3,page_3,pipeline.
+l,1073.8607594936714,415.5544554455446,14.974683544303797,23,45,3,page_3,pipeline.
+i,1088.8354430379752,415.5544554455446,14.974683544303797,23,46,3,page_3,pipeline.
+n,1103.810126582279,415.5544554455446,14.974683544303797,23,47,3,page_3,pipeline.
+e,1118.784810126583,415.5544554455446,14.974683544303797,23,48,3,page_3,pipeline.
+.,1133.7594936708867,415.5544554455446,14.974683544303797,23,49,3,page_3,pipeline.
+ ,1148.7341772151906,415.5544554455446,14.974683544303797,23,50,3,page_3,
+T,1163.7088607594944,415.5544554455446,14.974683544303797,23,51,3,page_3,This
+h,1178.6835443037983,415.5544554455446,14.974683544303797,23,52,3,page_3,This
+i,1193.6582278481021,415.5544554455446,14.974683544303797,23,53,3,page_3,This
+s,1208.632911392406,415.5544554455446,14.974683544303797,23,54,3,page_3,This
+ ,1223.6075949367098,415.5544554455446,14.974683544303797,23,55,3,page_3,
+i,1238.5822784810136,415.5544554455446,14.974683544303797,23,56,3,page_3,includes
+n,1253.5569620253175,415.5544554455446,14.974683544303797,23,57,3,page_3,includes
+c,1268.5316455696213,415.5544554455446,14.974683544303797,23,58,3,page_3,includes
+l,1283.5063291139252,415.5544554455446,14.974683544303797,23,59,3,page_3,includes
+u,1298.481012658229,415.5544554455446,14.974683544303797,23,60,3,page_3,includes
+d,1313.4556962025329,415.5544554455446,14.974683544303797,23,61,3,page_3,includes
+e,1328.4303797468367,415.5544554455446,14.974683544303797,23,62,3,page_3,includes
+s,1343.4050632911406,415.5544554455446,14.974683544303797,23,63,3,page_3,includes
+ ,1358.3797468354444,415.5544554455446,14.974683544303797,23,64,3,page_3,
+p,1373.3544303797482,415.5544554455446,14.974683544303797,23,65,3,page_3,parsing
+a,1388.329113924052,415.5544554455446,14.974683544303797,23,66,3,page_3,parsing
+r,1403.303797468356,415.5544554455446,14.974683544303797,23,67,3,page_3,parsing
+s,1418.2784810126598,415.5544554455446,14.974683544303797,23,68,3,page_3,parsing
+i,1433.2531645569636,415.5544554455446,14.974683544303797,23,69,3,page_3,parsing
+n,1448.2278481012675,415.5544554455446,14.974683544303797,23,70,3,page_3,parsing
+g,1463.2025316455713,415.5544554455446,14.974683544303797,23,71,3,page_3,parsing
+ ,1478.1772151898751,415.5544554455446,14.974683544303797,23,72,3,page_3,
+o,1493.151898734179,415.5544554455446,14.974683544303797,23,73,3,page_3,of
+f,1508.1265822784828,415.5544554455446,14.974683544303797,23,74,3,page_3,of
+ ,1523.1012658227867,415.5544554455446,14.974683544303797,23,75,3,page_3,
+e,1538.0759493670905,415.5544554455446,14.974683544303797,23,76,3,page_3,eye
+y,1553.0506329113944,415.5544554455446,14.974683544303797,23,77,3,page_3,eye
+e,1568.0253164556982,415.5544554455446,14.974683544303797,23,78,3,page_3,eye
+t,400.0,513.4059405940594,14.974358974358974,23,0,4,page_3,tracker
+r,414.974358974359,513.4059405940594,14.974358974358974,23,1,4,page_3,tracker
+a,429.94871794871796,513.4059405940594,14.974358974358974,23,2,4,page_3,tracker
+c,444.9230769230769,513.4059405940594,14.974358974358974,23,3,4,page_3,tracker
+k,459.8974358974359,513.4059405940594,14.974358974358974,23,4,4,page_3,tracker
+e,474.8717948717949,513.4059405940594,14.974358974358974,23,5,4,page_3,tracker
+r,489.84615384615387,513.4059405940594,14.974358974358974,23,6,4,page_3,tracker
+ ,504.8205128205128,513.4059405940594,14.974358974358974,23,7,4,page_3,
+d,519.7948717948718,513.4059405940594,14.974358974358974,23,8,4,page_3,data
+a,534.7692307692308,513.4059405940594,14.974358974358974,23,9,4,page_3,data
+t,549.7435897435898,513.4059405940594,14.974358974358974,23,10,4,page_3,data
+a,564.7179487179487,513.4059405940594,14.974358974358974,23,11,4,page_3,data
+ ,579.6923076923077,513.4059405940594,14.974358974358974,23,12,4,page_3,
+f,594.6666666666667,513.4059405940594,14.974358974358974,23,13,4,page_3,"files,"
+i,609.6410256410256,513.4059405940594,14.974358974358974,23,14,4,page_3,"files,"
+l,624.6153846153845,513.4059405940594,14.974358974358974,23,15,4,page_3,"files,"
+e,639.5897435897435,513.4059405940594,14.974358974358974,23,16,4,page_3,"files,"
+s,654.5641025641025,513.4059405940594,14.974358974358974,23,17,4,page_3,"files,"
+",",669.5384615384614,513.4059405940594,14.974358974358974,23,18,4,page_3,"files,"
+ ,684.5128205128203,513.4059405940594,14.974358974358974,23,19,4,page_3,
+t,699.4871794871793,513.4059405940594,14.974358974358974,23,20,4,page_3,transforming
+r,714.4615384615383,513.4059405940594,14.974358974358974,23,21,4,page_3,transforming
+a,729.4358974358972,513.4059405940594,14.974358974358974,23,22,4,page_3,transforming
+n,744.4102564102561,513.4059405940594,14.974358974358974,23,23,4,page_3,transforming
+s,759.3846153846151,513.4059405940594,14.974358974358974,23,24,4,page_3,transforming
+f,774.3589743589741,513.4059405940594,14.974358974358974,23,25,4,page_3,transforming
+o,789.333333333333,513.4059405940594,14.974358974358974,23,26,4,page_3,transforming
+r,804.3076923076919,513.4059405940594,14.974358974358974,23,27,4,page_3,transforming
+m,819.2820512820509,513.4059405940594,14.974358974358974,23,28,4,page_3,transforming
+i,834.2564102564099,513.4059405940594,14.974358974358974,23,29,4,page_3,transforming
+n,849.2307692307689,513.4059405940594,14.974358974358974,23,30,4,page_3,transforming
+g,864.205128205128,513.4059405940594,14.974358974358974,23,31,4,page_3,transforming
+ ,879.179487179487,513.4059405940594,14.974358974358974,23,32,4,page_3,
+p,894.153846153846,513.4059405940594,14.974358974358974,23,33,4,page_3,positional
+o,909.128205128205,513.4059405940594,14.974358974358974,23,34,4,page_3,positional
+s,924.102564102564,513.4059405940594,14.974358974358974,23,35,4,page_3,positional
+i,939.076923076923,513.4059405940594,14.974358974358974,23,36,4,page_3,positional
+t,954.051282051282,513.4059405940594,14.974358974358974,23,37,4,page_3,positional
+i,969.025641025641,513.4059405940594,14.974358974358974,23,38,4,page_3,positional
+o,984.0,513.4059405940594,14.974358974358974,23,39,4,page_3,positional
+n,998.974358974359,513.4059405940594,14.974358974358974,23,40,4,page_3,positional
+a,1013.948717948718,513.4059405940594,14.974358974358974,23,41,4,page_3,positional
+l,1028.9230769230771,513.4059405940594,14.974358974358974,23,42,4,page_3,positional
+ ,1043.897435897436,513.4059405940594,14.974358974358974,23,43,4,page_3,
+d,1058.871794871795,513.4059405940594,14.974358974358974,23,44,4,page_3,data
+a,1073.846153846154,513.4059405940594,14.974358974358974,23,45,4,page_3,data
+t,1088.8205128205132,513.4059405940594,14.974358974358974,23,46,4,page_3,data
+a,1103.794871794872,513.4059405940594,14.974358974358974,23,47,4,page_3,data
+ ,1118.769230769231,513.4059405940594,14.974358974358974,23,48,4,page_3,
+i,1133.74358974359,513.4059405940594,14.974358974358974,23,49,4,page_3,into
+n,1148.7179487179492,513.4059405940594,14.974358974358974,23,50,4,page_3,into
+t,1163.692307692308,513.4059405940594,14.974358974358974,23,51,4,page_3,into
+o,1178.666666666667,513.4059405940594,14.974358974358974,23,52,4,page_3,into
+ ,1193.641025641026,513.4059405940594,14.974358974358974,23,53,4,page_3,
+v,1208.6153846153852,513.4059405940594,14.974358974358974,23,54,4,page_3,velocity
+e,1223.589743589744,513.4059405940594,14.974358974358974,23,55,4,page_3,velocity
+l,1238.564102564103,513.4059405940594,14.974358974358974,23,56,4,page_3,velocity
+o,1253.5384615384621,513.4059405940594,14.974358974358974,23,57,4,page_3,velocity
+c,1268.5128205128212,513.4059405940594,14.974358974358974,23,58,4,page_3,velocity
+i,1283.4871794871801,513.4059405940594,14.974358974358974,23,59,4,page_3,velocity
+t,1298.461538461539,513.4059405940594,14.974358974358974,23,60,4,page_3,velocity
+y,1313.4358974358981,513.4059405940594,14.974358974358974,23,61,4,page_3,velocity
+ ,1328.4102564102573,513.4059405940594,14.974358974358974,23,62,4,page_3,
+d,1343.3846153846162,513.4059405940594,14.974358974358974,23,63,4,page_3,"data,"
+a,1358.358974358975,513.4059405940594,14.974358974358974,23,64,4,page_3,"data,"
+t,1373.333333333334,513.4059405940594,14.974358974358974,23,65,4,page_3,"data,"
+a,1388.3076923076928,513.4059405940594,14.974358974358974,23,66,4,page_3,"data,"
+",",1403.2820512820517,513.4059405940594,14.974358974358974,23,67,4,page_3,"data,"
+ ,1418.2564102564106,513.4059405940594,14.974358974358974,23,68,4,page_3,
+d,1433.2307692307695,513.4059405940594,14.974358974358974,23,69,4,page_3,detecting
+e,1448.2051282051284,513.4059405940594,14.974358974358974,23,70,4,page_3,detecting
+t,1463.1794871794873,513.4059405940594,14.974358974358974,23,71,4,page_3,detecting
+e,1478.1538461538462,513.4059405940594,14.974358974358974,23,72,4,page_3,detecting
+c,1493.128205128205,513.4059405940594,14.974358974358974,23,73,4,page_3,detecting
+t,1508.102564102564,513.4059405940594,14.974358974358974,23,74,4,page_3,detecting
+i,1523.0769230769229,513.4059405940594,14.974358974358974,23,75,4,page_3,detecting
+n,1538.0512820512818,513.4059405940594,14.974358974358974,23,76,4,page_3,detecting
+g,1553.0256410256407,513.4059405940594,14.974358974358974,23,77,4,page_3,detecting
+g,400.0,611.2574257425742,14.972222222222221,23,0,5,page_3,gaze
+a,414.97222222222223,611.2574257425742,14.972222222222221,23,1,5,page_3,gaze
+z,429.94444444444446,611.2574257425742,14.972222222222221,23,2,5,page_3,gaze
+e,444.9166666666667,611.2574257425742,14.972222222222221,23,3,5,page_3,gaze
+ ,459.8888888888889,611.2574257425742,14.972222222222221,23,4,5,page_3,
+e,474.86111111111114,611.2574257425742,14.972222222222221,23,5,5,page_3,events
+v,489.83333333333337,611.2574257425742,14.972222222222221,23,6,5,page_3,events
+e,504.8055555555556,611.2574257425742,14.972222222222221,23,7,5,page_3,events
+n,519.7777777777778,611.2574257425742,14.972222222222221,23,8,5,page_3,events
+t,534.75,611.2574257425742,14.972222222222221,23,9,5,page_3,events
+s,549.7222222222223,611.2574257425742,14.972222222222221,23,10,5,page_3,events
+ ,564.6944444444446,611.2574257425742,14.972222222222221,23,11,5,page_3,
+l,579.6666666666667,611.2574257425742,14.972222222222221,23,12,5,page_3,like
+i,594.6388888888889,611.2574257425742,14.972222222222221,23,13,5,page_3,like
+k,609.6111111111112,611.2574257425742,14.972222222222221,23,14,5,page_3,like
+e,624.5833333333335,611.2574257425742,14.972222222222221,23,15,5,page_3,like
+ ,639.5555555555557,611.2574257425742,14.972222222222221,23,16,5,page_3,
+s,654.5277777777778,611.2574257425742,14.972222222222221,23,17,5,page_3,saccades
+a,669.5000000000001,611.2574257425742,14.972222222222221,23,18,5,page_3,saccades
+c,684.4722222222224,611.2574257425742,14.972222222222221,23,19,5,page_3,saccades
+c,699.4444444444446,611.2574257425742,14.972222222222221,23,20,5,page_3,saccades
+a,714.4166666666667,611.2574257425742,14.972222222222221,23,21,5,page_3,saccades
+d,729.388888888889,611.2574257425742,14.972222222222221,23,22,5,page_3,saccades
+e,744.3611111111113,611.2574257425742,14.972222222222221,23,23,5,page_3,saccades
+s,759.3333333333335,611.2574257425742,14.972222222222221,23,24,5,page_3,saccades
+ ,774.3055555555557,611.2574257425742,14.972222222222221,23,25,5,page_3,
+a,789.2777777777779,611.2574257425742,14.972222222222221,23,26,5,page_3,and
+n,804.2500000000002,611.2574257425742,14.972222222222221,23,27,5,page_3,and
+d,819.2222222222224,611.2574257425742,14.972222222222221,23,28,5,page_3,and
+ ,834.1944444444446,611.2574257425742,14.972222222222221,23,29,5,page_3,
+f,849.1666666666667,611.2574257425742,14.972222222222221,23,30,5,page_3,"fixations,"
+i,864.1388888888889,611.2574257425742,14.972222222222221,23,31,5,page_3,"fixations,"
+x,879.1111111111111,611.2574257425742,14.972222222222221,23,32,5,page_3,"fixations,"
+a,894.0833333333333,611.2574257425742,14.972222222222221,23,33,5,page_3,"fixations,"
+t,909.0555555555554,611.2574257425742,14.972222222222221,23,34,5,page_3,"fixations,"
+i,924.0277777777776,611.2574257425742,14.972222222222221,23,35,5,page_3,"fixations,"
+o,938.9999999999998,611.2574257425742,14.972222222222221,23,36,5,page_3,"fixations,"
+n,953.972222222222,611.2574257425742,14.972222222222221,23,37,5,page_3,"fixations,"
+s,968.9444444444441,611.2574257425742,14.972222222222221,23,38,5,page_3,"fixations,"
+",",983.9166666666663,611.2574257425742,14.972222222222221,23,39,5,page_3,"fixations,"
+ ,998.8888888888885,611.2574257425742,14.972222222222221,23,40,5,page_3,
+c,1013.8611111111106,611.2574257425742,14.972222222222221,23,41,5,page_3,computing
+o,1028.8333333333328,611.2574257425742,14.972222222222221,23,42,5,page_3,computing
+m,1043.805555555555,611.2574257425742,14.972222222222221,23,43,5,page_3,computing
+p,1058.7777777777771,611.2574257425742,14.972222222222221,23,44,5,page_3,computing
+u,1073.7499999999993,611.2574257425742,14.972222222222221,23,45,5,page_3,computing
+t,1088.7222222222215,611.2574257425742,14.972222222222221,23,46,5,page_3,computing
+i,1103.6944444444437,611.2574257425742,14.972222222222221,23,47,5,page_3,computing
+n,1118.6666666666658,611.2574257425742,14.972222222222221,23,48,5,page_3,computing
+g,1133.638888888888,611.2574257425742,14.972222222222221,23,49,5,page_3,computing
+ ,1148.6111111111102,611.2574257425742,14.972222222222221,23,50,5,page_3,
+e,1163.5833333333323,611.2574257425742,14.972222222222221,23,51,5,page_3,event
+v,1178.5555555555545,611.2574257425742,14.972222222222221,23,52,5,page_3,event
+e,1193.5277777777767,611.2574257425742,14.972222222222221,23,53,5,page_3,event
+n,1208.4999999999989,611.2574257425742,14.972222222222221,23,54,5,page_3,event
+t,1223.472222222221,611.2574257425742,14.972222222222221,23,55,5,page_3,event
+ ,1238.4444444444432,611.2574257425742,14.972222222222221,23,56,5,page_3,
+p,1253.4166666666654,611.2574257425742,14.972222222222221,23,57,5,page_3,properties
+r,1268.3888888888875,611.2574257425742,14.972222222222221,23,58,5,page_3,properties
+o,1283.3611111111097,611.2574257425742,14.972222222222221,23,59,5,page_3,properties
+p,1298.333333333332,611.2574257425742,14.972222222222221,23,60,5,page_3,properties
+e,1313.305555555554,611.2574257425742,14.972222222222221,23,61,5,page_3,properties
+r,1328.2777777777762,611.2574257425742,14.972222222222221,23,62,5,page_3,properties
+t,1343.2499999999984,611.2574257425742,14.972222222222221,23,63,5,page_3,properties
+i,1358.2222222222206,611.2574257425742,14.972222222222221,23,64,5,page_3,properties
+e,1373.1944444444428,611.2574257425742,14.972222222222221,23,65,5,page_3,properties
+s,1388.166666666665,611.2574257425742,14.972222222222221,23,66,5,page_3,properties
+ ,1403.138888888887,611.2574257425742,14.972222222222221,23,67,5,page_3,
+l,1418.1111111111093,611.2574257425742,14.972222222222221,23,68,5,page_3,like
+i,1433.0833333333314,611.2574257425742,14.972222222222221,23,69,5,page_3,like
+k,1448.0555555555536,611.2574257425742,14.972222222222221,23,70,5,page_3,like
+e,1463.0277777777758,611.2574257425742,14.972222222222221,23,71,5,page_3,like
+s,400.0,709.1089108910891,14.973684210526315,23,0,6,page_3,saccade
+a,414.9736842105263,709.1089108910891,14.973684210526315,23,1,6,page_3,saccade
+c,429.9473684210526,709.1089108910891,14.973684210526315,23,2,6,page_3,saccade
+c,444.92105263157896,709.1089108910891,14.973684210526315,23,3,6,page_3,saccade
+a,459.89473684210526,709.1089108910891,14.973684210526315,23,4,6,page_3,saccade
+d,474.86842105263156,709.1089108910891,14.973684210526315,23,5,6,page_3,saccade
+e,489.84210526315786,709.1089108910891,14.973684210526315,23,6,6,page_3,saccade
+ ,504.81578947368416,709.1089108910891,14.973684210526315,23,7,6,page_3,
+a,519.7894736842104,709.1089108910891,14.973684210526315,23,8,6,page_3,amplitude
+m,534.7631578947368,709.1089108910891,14.973684210526315,23,9,6,page_3,amplitude
+p,549.7368421052631,709.1089108910891,14.973684210526315,23,10,6,page_3,amplitude
+l,564.7105263157894,709.1089108910891,14.973684210526315,23,11,6,page_3,amplitude
+i,579.6842105263156,709.1089108910891,14.973684210526315,23,12,6,page_3,amplitude
+t,594.657894736842,709.1089108910891,14.973684210526315,23,13,6,page_3,amplitude
+u,609.6315789473683,709.1089108910891,14.973684210526315,23,14,6,page_3,amplitude
+d,624.6052631578946,709.1089108910891,14.973684210526315,23,15,6,page_3,amplitude
+e,639.5789473684208,709.1089108910891,14.973684210526315,23,16,6,page_3,amplitude
+ ,654.5526315789472,709.1089108910891,14.973684210526315,23,17,6,page_3,
+a,669.5263157894735,709.1089108910891,14.973684210526315,23,18,6,page_3,and
+n,684.4999999999998,709.1089108910891,14.973684210526315,23,19,6,page_3,and
+d,699.473684210526,709.1089108910891,14.973684210526315,23,20,6,page_3,and
+ ,714.4473684210524,709.1089108910891,14.973684210526315,23,21,6,page_3,
+f,729.4210526315787,709.1089108910891,14.973684210526315,23,22,6,page_3,fixational
+i,744.394736842105,709.1089108910891,14.973684210526315,23,23,6,page_3,fixational
+x,759.3684210526312,709.1089108910891,14.973684210526315,23,24,6,page_3,fixational
+a,774.3421052631576,709.1089108910891,14.973684210526315,23,25,6,page_3,fixational
+t,789.3157894736839,709.1089108910891,14.973684210526315,23,26,6,page_3,fixational
+i,804.2894736842102,709.1089108910891,14.973684210526315,23,27,6,page_3,fixational
+o,819.2631578947364,709.1089108910891,14.973684210526315,23,28,6,page_3,fixational
+n,834.2368421052628,709.1089108910891,14.973684210526315,23,29,6,page_3,fixational
+a,849.2105263157891,709.1089108910891,14.973684210526315,23,30,6,page_3,fixational
+l,864.1842105263155,709.1089108910891,14.973684210526315,23,31,6,page_3,fixational
+ ,879.1578947368419,709.1089108910891,14.973684210526315,23,32,6,page_3,
+d,894.1315789473682,709.1089108910891,14.973684210526315,23,33,6,page_3,dispersion
+i,909.1052631578946,709.1089108910891,14.973684210526315,23,34,6,page_3,dispersion
+s,924.0789473684209,709.1089108910891,14.973684210526315,23,35,6,page_3,dispersion
+p,939.0526315789473,709.1089108910891,14.973684210526315,23,36,6,page_3,dispersion
+e,954.0263157894736,709.1089108910891,14.973684210526315,23,37,6,page_3,dispersion
+r,969.0,709.1089108910891,14.973684210526315,23,38,6,page_3,dispersion
+s,983.9736842105264,709.1089108910891,14.973684210526315,23,39,6,page_3,dispersion
+i,998.9473684210527,709.1089108910891,14.973684210526315,23,40,6,page_3,dispersion
+o,1013.9210526315791,709.1089108910891,14.973684210526315,23,41,6,page_3,dispersion
+n,1028.8947368421054,709.1089108910891,14.973684210526315,23,42,6,page_3,dispersion
+ ,1043.8684210526317,709.1089108910891,14.973684210526315,23,43,6,page_3,
+a,1058.8421052631581,709.1089108910891,14.973684210526315,23,44,6,page_3,and
+n,1073.8157894736846,709.1089108910891,14.973684210526315,23,45,6,page_3,and
+d,1088.7894736842109,709.1089108910891,14.973684210526315,23,46,6,page_3,and
+ ,1103.763157894737,709.1089108910891,14.973684210526315,23,47,6,page_3,
+v,1118.7368421052636,709.1089108910891,14.973684210526315,23,48,6,page_3,visualizing
+i,1133.71052631579,709.1089108910891,14.973684210526315,23,49,6,page_3,visualizing
+s,1148.6842105263163,709.1089108910891,14.973684210526315,23,50,6,page_3,visualizing
+u,1163.6578947368425,709.1089108910891,14.973684210526315,23,51,6,page_3,visualizing
+a,1178.631578947369,709.1089108910891,14.973684210526315,23,52,6,page_3,visualizing
+l,1193.6052631578955,709.1089108910891,14.973684210526315,23,53,6,page_3,visualizing
+i,1208.5789473684217,709.1089108910891,14.973684210526315,23,54,6,page_3,visualizing
+z,1223.552631578948,709.1089108910891,14.973684210526315,23,55,6,page_3,visualizing
+i,1238.5263157894744,709.1089108910891,14.973684210526315,23,56,6,page_3,visualizing
+n,1253.500000000001,709.1089108910891,14.973684210526315,23,57,6,page_3,visualizing
+g,1268.4736842105272,709.1089108910891,14.973684210526315,23,58,6,page_3,visualizing
+ ,1283.4473684210534,709.1089108910891,14.973684210526315,23,59,6,page_3,
+d,1298.4210526315799,709.1089108910891,14.973684210526315,23,60,6,page_3,data
+a,1313.3947368421063,709.1089108910891,14.973684210526315,23,61,6,page_3,data
+t,1328.3684210526326,709.1089108910891,14.973684210526315,23,62,6,page_3,data
+a,1343.3421052631588,709.1089108910891,14.973684210526315,23,63,6,page_3,data
+ ,1358.315789473685,709.1089108910891,14.973684210526315,23,64,6,page_3,
+a,1373.2894736842113,709.1089108910891,14.973684210526315,23,65,6,page_3,and
+n,1388.2631578947376,709.1089108910891,14.973684210526315,23,66,6,page_3,and
+d,1403.2368421052638,709.1089108910891,14.973684210526315,23,67,6,page_3,and
+ ,1418.21052631579,709.1089108910891,14.973684210526315,23,68,6,page_3,
+r,1433.1842105263163,709.1089108910891,14.973684210526315,23,69,6,page_3,results
+e,1448.1578947368425,709.1089108910891,14.973684210526315,23,70,6,page_3,results
+s,1463.1315789473688,709.1089108910891,14.973684210526315,23,71,6,page_3,results
+u,1478.105263157895,709.1089108910891,14.973684210526315,23,72,6,page_3,results
+l,1493.0789473684213,709.1089108910891,14.973684210526315,23,73,6,page_3,results
+t,1508.0526315789475,709.1089108910891,14.973684210526315,23,74,6,page_3,results
+s,1523.0263157894738,709.1089108910891,14.973684210526315,23,75,6,page_3,results
+w,400.0,806.9603960396039,14.974358974358974,23,0,7,page_3,with
+i,414.974358974359,806.9603960396039,14.974358974358974,23,1,7,page_3,with
+t,429.94871794871796,806.9603960396039,14.974358974358974,23,2,7,page_3,with
+h,444.9230769230769,806.9603960396039,14.974358974358974,23,3,7,page_3,with
+ ,459.8974358974359,806.9603960396039,14.974358974358974,23,4,7,page_3,
+s,474.8717948717949,806.9603960396039,14.974358974358974,23,5,7,page_3,several
+e,489.84615384615387,806.9603960396039,14.974358974358974,23,6,7,page_3,several
+v,504.8205128205128,806.9603960396039,14.974358974358974,23,7,7,page_3,several
+e,519.7948717948718,806.9603960396039,14.974358974358974,23,8,7,page_3,several
+r,534.7692307692308,806.9603960396039,14.974358974358974,23,9,7,page_3,several
+a,549.7435897435898,806.9603960396039,14.974358974358974,23,10,7,page_3,several
+l,564.7179487179487,806.9603960396039,14.974358974358974,23,11,7,page_3,several
+ ,579.6923076923077,806.9603960396039,14.974358974358974,23,12,7,page_3,
+t,594.6666666666667,806.9603960396039,14.974358974358974,23,13,7,page_3,types
+y,609.6410256410256,806.9603960396039,14.974358974358974,23,14,7,page_3,types
+p,624.6153846153845,806.9603960396039,14.974358974358974,23,15,7,page_3,types
+e,639.5897435897435,806.9603960396039,14.974358974358974,23,16,7,page_3,types
+s,654.5641025641025,806.9603960396039,14.974358974358974,23,17,7,page_3,types
+ ,669.5384615384614,806.9603960396039,14.974358974358974,23,18,7,page_3,
+o,684.5128205128203,806.9603960396039,14.974358974358974,23,19,7,page_3,of
+f,699.4871794871793,806.9603960396039,14.974358974358974,23,20,7,page_3,of
+ ,714.4615384615383,806.9603960396039,14.974358974358974,23,21,7,page_3,
+p,729.4358974358972,806.9603960396039,14.974358974358974,23,22,7,page_3,plotting
+l,744.4102564102561,806.9603960396039,14.974358974358974,23,23,7,page_3,plotting
+o,759.3846153846151,806.9603960396039,14.974358974358974,23,24,7,page_3,plotting
+t,774.3589743589741,806.9603960396039,14.974358974358974,23,25,7,page_3,plotting
+t,789.333333333333,806.9603960396039,14.974358974358974,23,26,7,page_3,plotting
+i,804.3076923076919,806.9603960396039,14.974358974358974,23,27,7,page_3,plotting
+n,819.2820512820509,806.9603960396039,14.974358974358974,23,28,7,page_3,plotting
+g,834.2564102564099,806.9603960396039,14.974358974358974,23,29,7,page_3,plotting
+ ,849.2307692307689,806.9603960396039,14.974358974358974,23,30,7,page_3,
+m,864.205128205128,806.9603960396039,14.974358974358974,23,31,7,page_3,methods.
+e,879.179487179487,806.9603960396039,14.974358974358974,23,32,7,page_3,methods.
+t,894.153846153846,806.9603960396039,14.974358974358974,23,33,7,page_3,methods.
+h,909.128205128205,806.9603960396039,14.974358974358974,23,34,7,page_3,methods.
+o,924.102564102564,806.9603960396039,14.974358974358974,23,35,7,page_3,methods.
+d,939.076923076923,806.9603960396039,14.974358974358974,23,36,7,page_3,methods.
+s,954.051282051282,806.9603960396039,14.974358974358974,23,37,7,page_3,methods.
+.,969.025641025641,806.9603960396039,14.974358974358974,23,38,7,page_3,methods.
diff --git a/tests/unit/stimulus/text_test.py b/tests/unit/stimulus/text_test.py
new file mode 100644
index 0000000..0b56041
--- /dev/null
+++ b/tests/unit/stimulus/text_test.py
@@ -0,0 +1,135 @@
+# Copyright (c) 2024 The pymovements Project Authors
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+"""Test Text stimulus class."""
+from pathlib import Path
+
+import polars
+import pytest
+from polars.testing import assert_frame_equal
+
+import pymovements as pm
+
+
+EXPECTED_DF = polars.DataFrame(
+    {
+        'char': [
+            'W',
+            'h',
+            'a',
+            't',
+            polars.Null,
+            'i',
+            's',
+            polars.Null,
+            'p',
+            'y',
+            'm',
+            'o',
+        ],
+        'top_left_x': [
+            400.0,
+            414.95,
+            429.9,
+            444.85,
+            459.8,
+            474.75,
+            489.7,
+            504.65,
+            519.6,
+            534.55,
+            549.5,
+            564.45,
+        ],
+        'top_left_y': [122.0 for _ in range(12)],
+        'width': [14.95 for _ in range(12)],
+        'height': [23 for _ in range(12)],
+        'char_idx_in_line': list(range(12)),
+        'line_idx': [0 for _ in range(12)],
+        'page': ['question_1' for _ in range(12)],
+        'word': [
+            'What',
+            'What',
+            'What',
+            'What',
+            polars.Null,
+            'is',
+            'is',
+            polars.Null,
+            'pymovements?',
+            'pymovements?',
+            'pymovements?',
+            'pymovements?',
+        ],
+    },
+)
+
+
+@pytest.mark.parametrize(
+    ('aoi_file', 'custom_read_kwargs', 'expected'),
+    [
+        pytest.param(
+            'tests/files/toy_text_1_1_aoi.csv',
+            None,
+            EXPECTED_DF,
+            id='toy_text_1_1_aoi',
+        ),
+        pytest.param(
+            Path('tests/files/toy_text_1_1_aoi.csv'),
+            {'separator': ','},
+            EXPECTED_DF,
+            id='toy_text_1_1_aoi',
+        ),
+    ],
+)
+def test_text_stimulus(aoi_file, custom_read_kwargs, expected):
+    aois = pm.stimulus.text.from_file(
+        aoi_file,
+        aoi_column='char',
+        pixel_x_column='top_left_x',
+        pixel_y_column='top_left_y',
+        width_column='width',
+        height_column='height',
+        page_column='page',
+        custom_read_kwargs=custom_read_kwargs,
+    )
+    head = aois.aois.head(12)
+
+    assert_frame_equal(
+        head,
+        expected,
+    )
+    assert len(aois.aois.columns) == len(expected.columns)
+
+
+def test_text_stimulus_unsupported_format():
+    with pytest.raises(ValueError) as excinfo:
+        pm.stimulus.text.from_file(
+            'tests/files/toy_text_1_1_aoi.pickle',
+            aoi_column='char',
+            pixel_x_column='top_left_x',
+            pixel_y_column='top_left_y',
+            width_column='width',
+            height_column='height',
+            page_column='page',
+        )
+    msg, = excinfo.value.args
+    expected = 'unsupported file format ".pickle".Supported formats are: '\
+        '[\'.csv\', \'.tsv\', \'.txt\']'
+    assert msg == expected