/// <summary> /// Analyze the specified input and parameters. /// </summary> /// <returns>The analyze.</returns> /// <param name="input">Input.</param> /// <param name="parameters">Parameters.</param> public IEnumerable <ICsvWritable> Analyze(IEnumerable <SensorReading> input, IEnumerable <Parameter> parameters) { // first, split records according to distinct labels containing the word "select" var inputGroups = input.Where(x => x.Label.Contains("select")).GroupBy(x => x.Label); if (inputGroups == null || !inputGroups.Any()) { return(new List <SelectResult>()); } // next, parse out the parameters we need var pauseCommand = parameters.Where(x => x.Field.Equals(CommandParameters.InstantaneousSpeed)).FirstOrDefault(); var pauseThreshold = decimal.Parse(pauseCommand.Clauses.Where(x => x.Key.Equals(CommandParameters.Threshold)).FirstOrDefault().Value); var pauseWindow = int.Parse(pauseCommand.Clauses.Where(x => x.Key.Equals(CommandParameters.Window)).FirstOrDefault().Value); var varianceCommand = parameters.Where(x => x.Field.Equals(CommandParameters.Acceleration)).FirstOrDefault(); var varianceThreshold = varianceCommand.Clauses.Where(x => x.Key.Equals(CommandParameters.Variance)).FirstOrDefault().Value; // next, for each group with a distinct label, calculate: // total task time // num of first record (when task starts) // num of first record when user starts moving // count of significant pauses // accel-x std. dev. // accel-y std. dev. // accel-z std. dev. var results = new List <SelectResult>(); foreach (var inputGroup in inputGroups) { // generating a result var result = new SelectResult { Label = inputGroup.First().Label, Duration = ((inputGroup.Last().RecordNum - inputGroup.First().RecordNum) * Constants.BAT.SAMPLING_PERIOD_IN_MS) / 1000.0M, TaskStartRecordNum = inputGroup.First().RecordNum, Pauses = PauseDurationAnalysis.EvaluatePause(inputGroup, CommandParameters.InstantaneousSpeed, pauseThreshold, pauseWindow), AccelXStdDev = MathService.StandardDeviation(inputGroup.Select(x => x.AccelX)), AccelYStdDev = MathService.StandardDeviation(inputGroup.Select(x => x.AccelY)), AccelZStdDev = MathService.StandardDeviation(inputGroup.Select(x => x.AccelZ)), StdDevThreshold = decimal.Parse(varianceThreshold) }; results.Add(result); } // finally, return the results (one record per input group) return(results); }
/// <summary> /// Analyze the specified input and parameters. /// </summary> /// <returns>The analyze.</returns> /// <param name="input">Input.</param> /// <param name="parameters">Parameters.</param> public IEnumerable <ICsvWritable> Analyze(IEnumerable <SensorReading> input, IEnumerable <Parameter> parameters) { // first, split records according to distinct labels containing the word "select" var inputGroups = input.Where(x => x.Label.Contains("select")).GroupBy(x => x.Label); if (inputGroups == null || !inputGroups.Any()) { return(new List <SelectResult>()); } // next, parse out the parameters we need var pauseCommand = parameters.Where(x => x.Field.Equals(CommandParameters.InstantaneousSpeed)).FirstOrDefault(); var pauseThreshold = decimal.Parse(pauseCommand.Clauses.Where(x => x.Key.Equals(CommandParameters.Threshold)).FirstOrDefault().Value); var pauseWindow = int.Parse(pauseCommand.Clauses.Where(x => x.Key.Equals(CommandParameters.Window)).FirstOrDefault().Value); var varianceCommand = parameters.Where(x => x.Field.Equals(CommandParameters.Acceleration)).FirstOrDefault(); var varianceThreshold = varianceCommand.Clauses.Where(x => x.Key.Equals(CommandParameters.Variance)).FirstOrDefault().Value; var results = new List <SelectResult>(); foreach (var inputGroup in inputGroups) { // converting accel to velocity List <decimal>[] velocities = { MathService.SimpsonsRuleIntegral(inputGroup.Select(x => x.AccelX).ToList()), MathService.SimpsonsRuleIntegral(inputGroup.Select(x => x.AccelY).ToList()), MathService.SimpsonsRuleIntegral(inputGroup.Select(x => x.AccelZ).ToList()) }; // converting velocity to position List <decimal>[] positions = { MathService.SimpsonsRuleIntegral(velocities[X_INDEX]), MathService.SimpsonsRuleIntegral(velocities[Y_INDEX]), MathService.SimpsonsRuleIntegral(velocities[Z_INDEX]) }; // generating a result var result = new SelectResult { Label = inputGroup.First().Label, Duration = ((inputGroup.Last().RecordNum - inputGroup.First().RecordNum) * Constants.BAT.SAMPLING_PERIOD_IN_SEC), TaskStartRecordNum = inputGroup.First().RecordNum, Pauses = PauseDurationAnalysis.EvaluatePause(inputGroup, CommandParameters.InstantaneousSpeed, pauseThreshold, pauseWindow), AccelXStdDev = positions[X_INDEX].Last(), AccelYStdDev = positions[Y_INDEX].Last(), AccelZStdDev = positions[Z_INDEX].Last(), StdDevThreshold = decimal.Parse(varianceThreshold) }; results.Add(result); } // finally, return the results (one record per input group) return(results); }