void FinishTrial()
    {
        this.finalPositionProjectedOnMovementAxis = ResultsMath.Projected3DPointCoordinate(initialTargetPosition, finalTargetPosition, positionActionEnded);

        double lastProjection = (lastTrial == null) ? 0 : lastTrial.finalPositionProjectedOnMovementAxis;

        this.effectiveAmplitudeOfMovement = ResultsMath.EffectiveAmplitude(
            initialTargetPosition, finalTargetPosition, this.finalPositionProjectedOnMovementAxis, lastProjection);
        this.distanceErrorFromTarget = (positionActionEnded - finalTargetPosition).magnitude;
    }
    public Throughput(TestMeasurements test)
    {
        totalTrials  = 0;
        missedTrials = 0;

        double        totalMovementTime       = 0;
        double        totalEffectiveAmplitude = 0;
        List <double> projectedCoordinates    = new List <double>();

        foreach (BlockMeasurements b in test.blocksData)
        {
            foreach (TrialMeasurements t in b.trialsData)
            {
                UpdateOutlierState(t);
                if (!t.isMarkedAsOutlier)
                {
                    totalTrials++;
                    if (t.missedTarget)
                    {
                        missedTrials++;
                    }
                    totalMovementTime       += t.trialDuration;
                    totalEffectiveAmplitude += t.effectiveAmplitudeOfMovement;
                    projectedCoordinates.Add(t.finalPositionProjectedOnMovementAxis);
                }
            }
        }
        double stdev = ResultsMath.ComputeStandardDeviation(projectedCoordinates);

        errorRate                  = (float)missedTrials / (float)totalTrials;
        averageMovementTime        = totalMovementTime / totalTrials;
        effectiveAmplitude         = totalEffectiveAmplitude / totalTrials;
        effectiveWidth             = ResultsMath.EffectiveWidthForStdevValue(stdev);
        effectiveIndexOfDifficulty = ResultsMath.IndexOfDifficulty(effectiveWidth, effectiveAmplitude);
        throughput                 = effectiveIndexOfDifficulty / averageMovementTime;
    }
 public IndexOfDifficulty(float targetWidth, float targetsDistance)
 {
     this.targetWidth       = targetWidth;
     this.targetsDistance   = targetsDistance;
     this.indexOfDifficulty = ResultsMath.IndexOfDifficulty(targetWidth, targetsDistance);
 }