aboutsummaryrefslogtreecommitdiff
path: root/docs/user_guide/gaze_analysis/gaze_position.md
blob: 8dce2b8d9b9ae3cc7eb0e39748fed01fb3e45a5a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
Gaze position
=============

[GazeFeatures](../../../argaze/#argaze.GazeFeatures) defines a [GazePosition](../../../argaze/#argaze.GazeFeatures.GazePosition) class to handle point coordinates with a precision value.

``` python
from argaze import GazeFeatures

# Define a basic gaze position
gaze_position = GazeFeatures.GazePosition((123, 456))

# Define a gaze position with a precision value
gaze_position = GazeFeatures.GazePosition((789, 765), precision=10)

# Access to gaze position value and precision
print(f'position: {gaze_position.value}')
print(f'precision: {gaze_position.precision}')

```

## Validity

[GazeFeatures](../../../argaze/#argaze.GazeFeatures) defines also a [UnvalidGazePosition](../../../argaze/#argaze.GazeFeatures.UnvalidGazePosition) class that inherits from [GazePosition](../../../argaze/#argaze.GazeFeatures.GazePosition) to handle case where no gaze position exists because of any specific device reason.

``` python
from argaze import GazeFeatures

# Define a basic unvalid gaze position
gaze_position = GazeFeatures.UnvalidGazePosition()

# Define a basic unvalid gaze position with a message value
gaze_position = GazeFeatures.UnvalidGazePosition("Something bad happened")

# Access to gaze position validity
print(f'validity: {gaze_position.valid}')

```

## Distance

[GazePosition](../../../argaze/#argaze.GazeFeatures.GazePosition) class provides a **distance** method to calculate the distance to another gaze position instance.

![Distance](../../img/distance.png)

``` python
# Distance between A and B positions
d = gaze_position_A.distance(gaze_position_B)
``` 

## Overlapping

[GazePosition](../../../argaze/#argaze.GazeFeatures.GazePosition) class provides an **overlap** method to test if a gaze position overlaps another one considering their precisions.

![Gaze overlapping](../../img/overlapping.png)

``` python
# Check that A overlaps B
if gaze_position_A.overlap(gaze_position_B): 

        # Do something if A overlaps B
        ...

# Check that A overlaps B and B overlaps A
if gaze_position_A.overlap(gaze_position_B, both=True): 

        # Do something if A overlaps B AND B overlaps A
        ...
```

## Timestamped gaze positions

[TimeStampedGazePositions](../../../argaze/#argaze.GazeFeatures.TimeStampedGazePositions) inherits from [TimeStampedBuffer](../../../argaze/#argaze.DataStructures.TimeStampedBuffer) class to handle especially gaze positions.

### Import from dataframe

It is possible to load timestamped gaze positions from a [Pandas DataFrame](https://pandas.pydata.org/docs/getting_started/intro_tutorials/01_table_oriented.html#min-tut-01-tableoriented) object.

```python
import pandas

# Load gaze positions from a CSV file into Panda Dataframe
dataframe = pandas.read_csv('gaze_positions.csv', delimiter="\t", low_memory=False)

# Convert Panda dataframe into TimestampedGazePositions buffer precising the use of each specific column labels
ts_gaze_positions = GazeFeatures.TimeStampedGazePositions.from_dataframe(dataframe, timestamp = 'Recording timestamp [ms]', x = 'Gaze point X [px]', y = 'Gaze point Y [px]')

```
### Iterator

Like [TimeStampedBuffer](../../../argaze/#argaze.DataStructures.TimeStampedBuffer), [TimeStampedGazePositions](../../../argaze/#argaze.GazeFeatures.TimeStampedGazePositions) class provides iterator feature:

```python
for timestamp, gaze_position in ts_gaze_positions.items():

        # Do something with each gaze position
        ...

```