This is a collaborative space. In order to contribute, send an email to maximilien.chaumon@icm-institute.org
On any page, type the letter L on your keyboard to add a "Label" to the page, which will make search easier.

Eyelink processing

Cette page propose un exemple de traitement de données issues de l'EyeLink utilisé au centre MEG.
Les données ont été recueillies pendant une expérience présentant au sujet des visages Fear, Happy et Neutral, soit au niveau de la bouche, soit au niveau des yeux.
Le but de l'analyse est d'étudier les saccades automatiques réflexes (par exemple en direction des yeux quand un visage est présenté au niveau de la bouche, jusqu'à 350ms après la présentation du visage) dans les différentes conditions.
L'enregistrement MEG a été effectué en 5 runs et les données de l'Eyelink se trouvent dans 5 fichiers textes (extension asc).
Les principales informations contenues dans un fichier de l'Eyelink et qui seront utilisées dans cet exemple sont :

  1. les événements de l'acquisition (présentation d'un visage, réponse du sujet)
  2. les débuts et fins de fixation
  3. les débuts et fins de saccade
  4. les débuts et fins de blinks
  5. la position des yeux et le diamètre pupillaire

Chaque information est associée à un échantillon.
Dans cette acquisition, c'est l’œil droit qui a été enregistré.

L'analyse de ces données est réalisé avec Matlab. Tous les scripts utilisés sur cette page se trouvent ici : /lena13/home_users/users/lemarechal/cluster_data/tests/nico_saccades/scripts ou ici : scripts.tgz

Les principales étapes de l'analyse sont:

  • lecture des données brutes, création des essais
  • définition des critères de réjection
  • analyse statistique et visualisation

De nombreux paramètres de l'analyse se trouvent dans le fichier saccadesParameters.m

Lecture des données brutes, création des essais

  • Lecture des données brutes

Le script readWriteData.m lit les fichiers de l'Eyelink pour tous les runs de tous les sujets. Il utilise le mode array du script readEyelink.m (développé par Benoît Béranger) et sauvegarde toutes les infos dans le fichier subjectId_allruns_allinfos_array.mat, ce qui permet de gagner du temps pour les étapes ultérieures.

  • Création des essais

Le script writeTrialsAllSubjects.m crée pour chaque sujet une matrice, chaque ligne correspondant à un essai, et les colonnes au sample de début, au sample de fin, au run et à la condition de l'essai. Cette matrice est sauvegardée pour chaque sujet dans subjectId_allTrials.mat.


Le script modifySamplesAllSubjects.m modifie le champ SAMPLE de la structure subjectId_allruns_allinfos_array.mat et la sauve dans subjectId_allruns_allinfos_array_allsamples.mat. La raison de cette modification vient du fait que la fonction readEyelink.m crée un champ SAMPLE (liste de tous les samples pour lesquels la position des yeux et le diamètre pupillaire sont disponibles) et un champ SAMPLE_NO_INFO (liste de tous les samples pour lesquels la position des yeux et le diamètre pupillaire NE sont PAS disponibles, pendant un blink par exemple). Par besoin de simplification, les 2 champs SAMPLE et SAMPLE_NO_INFO sont fusionnés pour avoir une seule liste contenant tous les samples et sauvegardés dans subjectId_allruns_allinfos_array_allsamples.mat.

Définition des critères de réjection

Pour les besoins de l'étude, nous rejetons les essais selon les critères suivants:

  • mauvaise réponse du sujet (émotion du visage présenté)
  • le sujet fait un blink autour de la présentation du visage : [ -300ms 500ms ]

  • le sujet fait une saccade plus grande que 1 degré autour de la présentation du visage : [ -300ms 150ms ]

  • le sujet ne regarde pas la croix de fixation autour de la présentation du visage : [ -300ms 150ms ]

Les paramètres de tous ces critères se trouvent dans saccadeParameters.m
Chacun de ces critères va être analysé successivement pour obtenir à la fin une liste des essais "valides".

  • le script analyzeCriterion1.m retourne un vecteur avec la réponse du sujet à chaque essai et un vecteur avec la validité de chaque essai (0 si valide et 1 sinon) et la sauve dans subjectId_crit1.mat (le script analyzeCriterion1AllSubjects.m écrit subjectId_crit1.mat pour tous les sujets).
  • le script analyzeCriterion2.m retourne une matrice, la premiere colonne pour les samples de début de blink (0 si pas de début de blink dans l'essai) et la deuxieme colonne pour les samples de fin de blink (0 si pas de fin de blink dans l'essai), chaque ligne correspondant à un essai et un vecteur avec la validité de chaque essai (0 si valide et 1 sinon) et la sauve dans subjectId_crit2.mat (le script analyzeCriterion2AllSubjects.m écrit subjectId_crit2.mat pour tous les sujets).
  • le script analyzeCriterion3.m est similaire au script analyzeCriterion2.m mais traite les saccades au lieu des blinks (le script analyzeCriterion3AllSubjects.m écrit subjectId_crit3.mat pour tous les sujets).
  • le script analyzeCriterion4.m retourne une matrice contenant la position de l'oeil (X et Y) durant l'intervalle de fixation d'intérêt (défini dans saccadeParameters.m), ici [ -300ms 150ms ] autour de la présentation du visage et un vecteur avec la validité de chaque essai (0 si valide, 1 si la position des yeux est invalide et 2 sinon) et la sauve dans subjectId_crit4.mat (le script analyzeCriterion4AllSubjects.m écrit subjectId_crit4.mat pour tous les sujets).

  • le script plotCriterion4.m affiche toutes les positions de l'oeil par rapport à la croix de fixation (en fait par rapport à un carré de tolérance défini autour de la croix de fixation) pour les essais valides et les essais invalides issus du critère 4. Le paramètre useCriterion3 permet de n'afficher que les essais valides également pour le critère 3 (le script plotCriterion4AllSubjects.m affiche les positions pour chaque sujet).

{{ :criterion4.png?300 |}}

  • le script analyzeAllCriteria.m calcule le nombre et le pourcentage d'essais valides et invalides pour un sujet (le script analyzeAllCriteriaAllSubjects.m le fait pour tous les sujets).

Pour tous ces scripts, des messages sont affichés à la fin pour indiquer les nombres et les pourcentages d'essais valides et invalides.
Par contre, dans tous les scripts (excepté pour plotCriterion4.m qui peut prendre en compte les essais rejetés par le critère 3), ces critères sont appliqués indépendamment les uns des autres (le critère 2 est appliqués à tous les essais et non pas aux essais valides issus du critère 1).

Analyse statistique et visualisation

  • le script analyzeSubject.m retourne une liste des saccades automatiques détectées (instant et amplitude) qui arrivent avant saccadeMaximumInstant après la présentation du visage et de degré supérieur à saccadeMinimumDegree : cf saccadesParameters.m) par condition, à travers les essais valides et écrit subjectId_saccades.mat. Il affiche aussi le nombre et les pourcentages d'essais présentant ces saccades. Le script analyzeAllSubjects.m fait ces calculs et affiche les infos pour tous les sujets.
  • le script statSaccades.m utilise le fichier subjectId_saccades.mat et calcule pour chaque condition le pourcentage de saccades dans chaque direction (déplacement vers le haut ou vers le bas). Le script statSaccadesAllSubjects.m fait ces calculs et affiche les infos pour tous les sujets.
  • le script displayStatSaccades.m affiche les stats de saccades automatiques pour chaque sujet, la moyenne des sujets et la moyenne pondérée (All Subjects) par le nombre d'essais valides pour chaque sujet

{{ :statsaccades.png?300 |}}