コード例 #1
0
        public static double CountPursoitGain(double[] eye, double[] spot)
        {
            var spotOnScreenDistance = SaccadeDataHelper.CountOnScreenDistance(spot.ToArray()).Sum();
            var eyeOnScreenDistance  = SaccadeDataHelper.CountOnScreenDistance(eye.ToArray()).Sum();

            return(eyeOnScreenDistance / spotOnScreenDistance);
        }
コード例 #2
0
        public static ResultData FindSpotEyePointsForSaccadeAntiSaccadeSearch(SpotGazeFileData fileData, CalcConfig calcConfig)
        {
            var spotMovePositions = new List <SpotMove>();
            //wyznaczamy środek amplitudy
            var mncal = fileData.Spot.Min();
            var mxcal = fileData.Spot.Max();

            double[] spotMinMaxDelta   = { Math.Abs(mncal), mxcal };
            var      meanSpotAmplitude = spotMinMaxDelta.Average();


            var recStart = calcConfig.RecStart;

            var eyeShiftPeriod  = calcConfig.EyeShiftPeriod;
            var spotShiftPeriod = calcConfig.SpotShiftPeriod;
            //var eyeAmpProp = calcConfig.EyeAmpProp;
            var spotAmpProp = calcConfig.SpotAmpProp;

            // dane od recStart
            //var recLenght = (recEnd - recStart);
            //var timeDeltas = fileData.TimeDeltas.Skip(recStart).Take(recLenght).ToArray();
            //var eyeCoords = fileData.Eye.Skip(recStart).Take(recLenght).ToArray();
            //var spotCoords = fileData.Spot.Skip(recStart).Take(recLenght).ToArray();

            var timeDeltas = fileData.TimeDeltas;
            var eyeCoords  = fileData.Eye;
            var spotCoords = fileData.Spot;
            var timeStamps = fileData.Time;

            // tworzymy kopie danych z przesniętym reye, leye na shiftPeriod do tyłu (przed poczatkiem),
            //spot do przodu początek na (+ shifPeroid) ?
            var shiftedEyeCoords  = BackRollArray(eyeCoords, eyeShiftPeriod);
            var shiftedSpotCoords = BackRollArray(spotCoords, spotShiftPeriod);

            //# wylapujemy zmiany amplitudy sygnalu, dla oczu wieksza tolerancja z powodu mniejszej przewidywalnosci
            //czy różnica amplitud pomiędzy przesuniętymi odcinkami jest większa niż średnia amplitudy spot ('true')
            // z okna: amplituda przesuniete minus amplituda oryginalne
            //var rightEyeOverMeanSpotAmplitudeIndexes = GetIndexesOverAmplitude(shiftedEyeCoords, eyeCoords, meanSpotAmplitude, eyeAmpProp);
            var spotAmplitudeOverMeanIndexes = GetIndexesOverAmplitude(shiftedSpotCoords, spotCoords, meanSpotAmplitude, spotAmpProp);

            var lowestEyeOverAmpIndxesForSpotIndexes = new List <int>();

            // dla każdego rekordu spot powyżej amplitudy
            for (int i = 0; i < spotAmplitudeOverMeanIndexes.Count; i++)
            {
                // dla każdego rekordu spot powyżej amplitudy, obliczamy różnicę dla rekordów amplitudy oczu
                // bieżemy tylko indeksy wartości z różnicą więszą niż 5
                var currSpotOverMeanIndex = spotAmplitudeOverMeanIndexes[i];
                var currentSpotShiftIndex = SaccadeDataHelper.CountSpotShiftIndex(currSpotOverMeanIndex, eyeShiftPeriod);

                if (currentSpotShiftIndex < timeDeltas.Count())
                {
                    spotMovePositions.Add(new SpotMove
                    {
                        SpotStartIndex     = currSpotOverMeanIndex,
                        SpotStartTimeDelta = timeDeltas[currSpotOverMeanIndex],
                        SpotStartTimeStamp = timeStamps[currSpotOverMeanIndex],
                        SpotStartCoord     = spotCoords[currSpotOverMeanIndex],

                        SpotEndIndex     = currentSpotShiftIndex,
                        SpotEndTimeDelta = timeDeltas[currentSpotShiftIndex],
                        SpotEndTimeStamp = timeStamps[currentSpotShiftIndex],
                        SpotEndCoord     = spotCoords[currentSpotShiftIndex],
                    });
                }
            }

            // zawezamy znalezione zmiany amplitudy dla oczu tak aby odpowiadaly w miare pewnym zmianom amplitudy markera
            // tylko amplitudy oka o indeksie równym najniżeszmu indeksowi zredukowanych punktów amplitudy oka
            //var earliestEyeOverAmpForSpotOverAmpIndexes = NarrowList(rightEyeOverMeanSpotAmplitudeIndexes, lowestEyeOverAmpIndxesForSpotIndexes);

            var results = new ResultData();

            results = new ResultData
            {
                SpotOverMeanIndex = spotAmplitudeOverMeanIndexes,
                SpotMoves         = spotMovePositions,
                EyeCoords         = eyeCoords,
                ShiftPeriod       = eyeShiftPeriod,
                SpotCoords        = spotCoords,
                TimeDeltas        = timeDeltas,
                TimeStamps        = fileData.Time,
            };

            return(results);
        }