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); }
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); }