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);
    }
    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);
    }
Esempio n. 3
0
    /// <summary>
    /// Prior to the use of csv, the software used to write the results in a JSON file.
    /// The code below can decode those files.
    /// </summary>
    private List <ExperimentResultRecord> GenerateCSVFileFromDictionary(JObject data)
    {
        var test       = (JObject)data["test"];
        var config     = (JObject)test["configuration"];
        var targets    = (JArray)config["targetsPositions"];
        var testData   = (JObject)test["data"];
        var blocksData = (JArray)testData["blocksData"];
        var trialsData = (JArray)((JObject)blocksData[0])["trialsData"];
        var computed   = (JObject)data["computedResults"];

        int trialCount = 0;
        List <ExperimentResultRecord> results = new List <ExperimentResultRecord>();

        foreach (JObject t in trialsData)
        {
            ExperimentResultRecord r = new ExperimentResultRecord();
            r.participantCode = (string)data["ParticipantCode"];
            r.conditionCode   = (string)data["ConditionCode"];
            r.sessionCode     = (string)data["SessionCode"];
            r.groupCode       = (string)data["GroupCode"];

            r.task = (string)data["ExperimentTask"];
            r.cursorPositioningMethod = (string)data["PositioningMethod"];
            r.cursorSelectionMethod   = (string)data["SelectionMethod"];

            r.numberOfTargets   = (int)config["numberOfTargets"];
            r.amplitude         = (float)config["targetDistance"];
            r.width             = (float)config["targetWidth"];
            r.indexOfDifficulty = (float)config["indexOfDifficulty"];
            r.cursorWidth       = data.GetValue("CursorWidth").Value <float>();
            r.planeOrientation  = (string)data["PlaneOrientation"];

            r.timestamp     = (string)testData["timestamp"];
            r.totalDuration = (float)testData["testDuration"];

            JObject block = (JObject)blocksData[0];
            r.blockId       = (int)block["blockId"];
            r.blockDuration = (float)block["blockDuration"];

            r.trialId       = (int)t["trialId"];
            r.trialDuration = (float)t["trialDuration"];

            r.fromTargetId = (int)t["initialTargetId"];
            JObject fromPos = (JObject)targets[trialCount];
            r.xFrom = (float)fromPos["x"];
            r.yFrom = (float)fromPos["y"];
            r.zFrom = (float)fromPos["z"];

            trialCount = (trialCount + 1) % r.numberOfTargets;

            r.toTargetId = (int)t["finalTargetId"];
            JObject toPos = (JObject)targets[trialCount];
            r.xTo = (float)toPos["x"];
            r.yTo = (float)toPos["y"];
            r.zTo = (float)toPos["z"];

            JObject fromMeasured = (JObject)t["initialPosition"];
            r.xTrialStarted = (float)fromMeasured["x"];
            r.yTrialStarted = (float)fromMeasured["y"];
            r.zTrialStarted = (float)fromMeasured["z"];

            JObject toMeasured = (JObject)t["finalPosition"];
            r.xActionEnded = (float)toMeasured["x"];
            r.yActionEnded = (float)toMeasured["y"];
            r.zActionEnded = (float)toMeasured["z"];

            r.missedTarget = (int)t["missedTarget"];

            r.projectionOnMovementAxis   = (float)t["finalProjectedCoordinate"];
            r.effectiveWidth             = (float)computed["effectiveWidth"];
            r.effectiveIndexOfDifficulty = (float)computed["effectiveIndexOfDifficulty"];

            r.errorRate           = (float)computed["errorRate"];
            r.averageMovementTime = (float)computed["averageMovementTime"];
            r.throughput          = (float)computed["throughput"];

            r.observations = (string)data["Observations"];

            results.Add(r);
        }

        return(results);
    }