void ExportFrameDataToFile(TestMeasurements results)
    {
        string filename  = GetFrameDataResultsFilenameForTest(results);
        string directory = FileManager.GetFrameDataFolder(configuration.participantCode);

        FileManager.WriteToCsvFile(directory, filename, frameData);
    }
 public void OnTestEnded(TestMeasurements testMeasurements)
 {
     Debug.Log("[ExperimentController] Current test finished.");
     ExportResultsToFile(testMeasurements);
     AbortCurrentTest();
     panelResults.ShowPanel(testMeasurements, () => { RunNextTestConfiguration(); });
 }
Exemple #3
0
    public void ShowPanel(TestMeasurements results, Action OnClose)
    {
        _onClose = OnClose;

        int nTargets = results.configuration.numberOfTargets;
        int nErrors  = Mathf.RoundToInt(nTargets * (float)results.computedResults.errorRate);

        numTrials.text = nTargets.ToString();
        numErrors.text = nErrors.ToString();

        amplitude.text          = DoubleToString(results.sequenceInfo.targetsDistance, aThousand) + " (mm)";
        effectiveAmplitude.text = DoubleToString(results.computedResults.effectiveAmplitude, aThousand) + " (mm)";

        width.text          = DoubleToString(results.sequenceInfo.targetWidth, aThousand) + " (mm)";
        effectiveWidth.text = DoubleToString(results.computedResults.effectiveWidth, aThousand) + " (mm)";

        indexOfDifficulty.text          = DoubleToString(results.sequenceInfo.indexOfDifficulty) + " bits";
        effectiveIndexOfDifficulty.text = DoubleToString(results.computedResults.effectiveIndexOfDifficulty) + " bits";

        errorRate.text    = DoubleToString(results.computedResults.errorRate, 100) + "%";
        movementTime.text = DoubleToString(results.computedResults.averageMovementTime, aThousand) + " ms/trial";
        throughput.text   = DoubleToString(results.computedResults.throughput) + " bits/s";

        this.gameObject.SetActive(true);
    }
    void ExportResultsToFile(TestMeasurements results)
    {
        string directory = FileManager.GetResultsFolder(results.configuration.participantCode);
        string filename  = FileManager.GetResultsFilenameForTest(results) + ".csv";
        var    records   = ExperimentResultRecord.GetRecordsFromTestMeasurements(results, transform.position, transform.rotation.eulerAngles);

        FileManager.WriteToCsvFile(directory, filename, records);

        ExportFrameDataToFile(results);
    }
Exemple #5
0
        private List <MeasurementDto> GetListOfFiveMeasurementsWithRandomData()
        {
            List <MeasurementDto> measurementsList = new List <MeasurementDto>();

            for (int i = 0; i < 5; i++)
            {
                measurementsList.Add(TestMeasurements.RandomMeasurement().WithId(i).Build());
            }

            return(measurementsList);
        }
Exemple #6
0
 void StartTest()
 {
     if (currentStatus != TestStatus.Running)
     {
         SetCurrentStatus(TestStatus.Running);
         testData             = new TestMeasurements(configuration, currentSequence, targets);
         testData.timestamp   = System.DateTime.Now.ToString("s");
         testData.initialTime = Time.realtimeSinceStartup;
         RunNextBlock();
     }
 }
Exemple #7
0
        public void UT_M_04_Given_ValidMeasurement_When_PostThisMeasurement_Then_ShouldReturnOkCode()
        {
            //Arrange
            var measurement = TestMeasurements.DefaultMeasurement().Build();

            _mockService.Setup(x => x.AddMeasurement(It.IsAny <string>(), measurement));

            //Act
            var response = _controller.PostMeasurement(measurement);


            //Assert
            Assert.IsInstanceOfType(response, typeof(OkResult));
        }
Exemple #8
0
        public void UT_M_09_Given_NoMeasurementInDatabaseWithThisId_When_PutAnotherMeasurementOnThisId_Then_ShouldReturnNotFoundCode()
        {
            //Arrange
            var measurement = TestMeasurements.DefaultMeasurement().Build();

            _mockService.Setup(x => x.DoesMeasurementExists(It.IsAny <string>(), It.IsAny <int>()))
            .Returns(false);
            _mockService.Setup(x => x.UpdateMeasurement(It.IsAny <string>(), measurement));

            //Act
            var response      = _controller.PutMeasurement(measurement.Id, measurement);
            var contentResult = response as StatusCodeResult;

            //Assert
            Assert.AreEqual(HttpStatusCode.NotFound, contentResult.StatusCode);
        }
Exemple #9
0
        public void UT_M_08_Given_MeasurementInDatabase_When_PutAnotherMeasurementOnTheIdOfThisMeasurement_Then_ShouldReturnOkCode()
        {
            //Arrange
            var measurement    = TestMeasurements.DefaultMeasurement().Build();
            var newMeasurement = TestMeasurements.RandomMeasurement().Build();

            _mockService.Setup(x => x.DoesMeasurementExists(It.IsAny <string>(), It.IsAny <int>()))
            .Returns(true);
            _mockService.Setup(x => x.UpdateMeasurement(It.IsAny <string>(), measurement));
            _controller.PostMeasurement(measurement);

            //Act
            var response = _controller.PutMeasurement(measurement.Id, newMeasurement);

            //Assert
            Assert.IsInstanceOfType(response, typeof(OkResult));
        }
Exemple #10
0
        public void UT_M_01_Given_MeasurementInDatabase_When_GetThisMeasurement_Then_ShouldReturnThisMeasurementWithOkCode()
        {
            //Arrange
            var measurement = TestMeasurements.DefaultMeasurement().Build();

            _mockService.Setup(x => x.GetMeasurement(It.IsAny <string>(), measurement.Id))
            .Returns(measurement);

            //Act
            var response      = _controller.GetMeasurement(measurement.Id);
            var contentResult = response as OkNegotiatedContentResult <MeasurementDto>;

            //Assert
            Assert.IsNotNull(contentResult);
            Assert.IsNotNull(contentResult.Content);
            Assert.AreEqual(measurement.Id, contentResult.Content.Id);
            Assert.AreEqual(measurement.Date, contentResult.Content.Date);
            Assert.AreEqual(measurement.Description, contentResult.Content.Description);
            Assert.AreEqual(measurement.Result, contentResult.Content.Result);
        }
Exemple #11
0
        public void UT_M_07_Given_InvalidMeasurementWithNegativeResult_When_PostThisMeasurement_Then_ShouldReturnInvalidModelState()
        {
            //Arrange
            var measurement = TestMeasurements.DefaultMeasurement();
            var measurementWithNegativeResult = measurement.WithNegativeResult().Build();

            var validationContext = new ValidationContext(measurementWithNegativeResult, null, null);
            var validationResults = new List <ValidationResult>();

            Validator.TryValidateObject(measurementWithNegativeResult, validationContext, validationResults, true);
            foreach (var validationResult in validationResults)
            {
                _controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage);
            }

            //Act
            var response = _controller.PostMeasurement(measurementWithNegativeResult);

            //Assert
            Assert.IsInstanceOfType(response, typeof(InvalidModelStateResult));
        }
    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 static List <ExperimentResultRecord> GetRecordsFromTestMeasurements(TestMeasurements test, Vector3 experimentPosition, Vector3 experimentRotation)
    {
        List <ExperimentResultRecord> results = new List <ExperimentResultRecord>();

        foreach (BlockMeasurements b in test.blocksData)
        {
            foreach (TrialMeasurements t in b.trialsData)
            {
                ExperimentResultRecord r = new ExperimentResultRecord();
                r.participantCode = test.configuration.participantCode;
                r.conditionCode   = test.configuration.conditionCode;
                r.sessionCode     = test.configuration.sessionCode;
                r.groupCode       = test.configuration.groupCode;

                r.task = Enum2String.GetTaskString(test.configuration.experimentTask);
                r.cursorPositioningMethod = Enum2String.GetCursorPositioningMethodString(test.configuration.cursorPositioningMethod);
                r.cursorSelectionMethod   = Enum2String.GetCursorSelectionMethodString(test.configuration.cursorSelectionMethod);

                r.numberOfTargets   = test.configuration.numberOfTargets;
                r.amplitude         = test.sequenceInfo.targetsDistance;
                r.width             = test.sequenceInfo.targetWidth;
                r.indexOfDifficulty = test.sequenceInfo.indexOfDifficulty;
                r.cursorWidth       = test.configuration.cursorWidth;
                r.planeOrientation  = Enum2String.GetPlaneOrientationString(test.configuration.planeOrientation);

                if (test.configuration.cursorSelectionMethod == CursorSelectionMethod.DwellTime)
                {
                    r.dwellTime = test.configuration.dwellTime;
                }
                else
                {
                    r.dwellTime = -1;
                }

                r.errorRate           = test.computedResults.errorRate;
                r.averageMovementTime = test.computedResults.averageMovementTime;
                r.throughput          = test.computedResults.throughput;

                r.effectiveIndexOfDifficulty = test.computedResults.effectiveIndexOfDifficulty;
                r.effectiveWidth             = test.computedResults.effectiveWidth;
                r.effectiveAmplitude         = test.computedResults.effectiveAmplitude;

                r.projectionOnMovementAxis = t.finalPositionProjectedOnMovementAxis;
                r.amplitudeOnMovementAxis  = t.effectiveAmplitudeOfMovement;
                r.distanceError            = t.distanceErrorFromTarget;

                r.timestamp     = test.timestamp;
                r.totalDuration = test.testDuration;

                r.blockId       = b.blockId;
                r.blockDuration = b.blockDuration;

                r.trialId = t.trialId;

                r.timeTrialStarted  = t.initialTime;
                r.timeActionStarted = t.timeActionStarted;
                r.timeActionEnded   = t.timeActionEnded;
                r.trialDuration     = t.trialDuration;

                r.fromTargetId = t.initialTargetId;
                r.xFrom        = t.initialTargetPosition.x;
                r.yFrom        = t.initialTargetPosition.y;
                r.zFrom        = t.initialTargetPosition.z;

                r.toTargetId = t.finalTargetId;
                r.xTo        = t.finalTargetPosition.x;
                r.yTo        = t.finalTargetPosition.y;
                r.zTo        = t.finalTargetPosition.z;

                r.xTrialStarted = t.initialPosition.x;
                r.yTrialStarted = t.initialPosition.y;
                r.zTrialStarted = t.initialPosition.z;

                r.xActionStarted = t.positionActionStarted.x;
                r.yActionStarted = t.positionActionStarted.y;
                r.zActionStarted = t.positionActionStarted.z;

                r.xActionEnded = t.positionActionEnded.x;
                r.yActionEnded = t.positionActionEnded.y;
                r.zActionEnded = t.positionActionEnded.z;

                r.missedTarget    = t.missedTarget ? 1 : 0;
                r.markedAsOutlier = t.isMarkedAsOutlier ? 1 : 0;

                r.xPlanePosition = experimentPosition.x;
                r.yPlanePosition = experimentPosition.y;
                r.zPlanePosition = experimentPosition.z;

                r.xPlaneRotation = experimentRotation.x;
                r.yPlaneRotation = experimentRotation.y;
                r.zPlaneRotation = experimentRotation.z;

                r.screenPixelsPerMillimeter = test.configuration.screenPixelsPerMillimeter;
                r.observations = test.configuration.observations;

                results.Add(r);
            }
        }

        return(results);
    }
Exemple #14
0
 public static string GetResultsFilenameForTest(TestMeasurements test)
 {
     return(GetResultsFilenamePrefix(test.configuration) + "-" + test.timestamp.Replace(":", "_"));
 }
 string GetFrameDataResultsFilenameForTest(TestMeasurements test)
 {
     return("FrameData_" + FileManager.GetResultsFilenameForTest(test) + ".csv");
 }