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