/// <summary> /// Обрабатывает source_data по методике HRV. /// Ожидается, что source_data является HrvRawData /// </summary> /// <param name="source_data"></param> /// <returns></returns> public override IMethodProcessedData ProcessData(IMethodRawData source_data) { var rawHrvData = source_data as HrvRawData; if (rawHrvData == null) { throw new ArgumentException( $"Invalid input data format. Expected object of type {typeof(HrvRawData)}"); } return(ProcessData(rawHrvData)); }
private DateTimeOffset GetCompletionDate(IMethodRawData hrvInputData, IMethodRawData svmrInputData) { var hrvCompletionTime = DateTimeOffset.MinValue; var svmrCompletionTime = DateTimeOffset.MinValue; if (null != hrvInputData.TestInfo) { hrvCompletionTime = hrvInputData.TestInfo.FinishTime; } if (null != svmrInputData.TestInfo) { svmrCompletionTime = svmrInputData.TestInfo.FinishTime; } return(Max(hrvCompletionTime, svmrCompletionTime)); }
private bool InputDataContainsCardioIntervals(IMethodRawData rawData) { var data_for_all = rawData.PhysioData; System.Diagnostics.Debug.Assert(data_for_all != null); // in this method we always have only one patient var allData = rawData.PhysioData; // and we must have at least some physio data System.Diagnostics.Debug.Assert(allData != null); // first, we take all the data var intervals = allData.GetChannelDataBySignalType(SignalType.CardioIntervals); return(intervals != null && intervals.Any()); }
public virtual IMethodProcessedData ProcessData(IMethodRawData source_data) { if (ProcessorOutputData == null) { throw new InvalidOperationException( "поле m_ProcessorOutputData должно быть инициализировано в конструкторе класса-наследника!!!"); } // Здесь просто пробрасывается на выход информация об обследовании // 1. Наименование методики обследования // 2. Обследуемый // 3. Дата и время проведения обследования // 4. Тип обследования (тренировка, предсменный контроль и т.д.) var ti = source_data.TestInfo; if (ti != null) { ProcessorOutputData.TestInfo = ti; } return(ProcessorOutputData); }
} // DataProcessor /// <summary> /// Обрабатывает source_data. /// </summary> /// <param name="source_data"></param> /// <returns></returns> public override IMethodProcessedData ProcessData(IMethodRawData source_data) { if (null == base.ProcessData(source_data)) { return(null); } var tr = source_data as SvmrRawData; if (tr == null) { return(null); } var ti = source_data.TestInfo; if (ti == null) { return(null); // Нам подали на вход что-то не то. } if (ti.MethodId != SvmrMethodId.MethodId) { return(null); // Нам подали на вход что-то не то. } var allReactionTimes = new List <float>(100); var allReactionErrors = new List <ReactionError>(100); // int previousReactionTime = -1; double ReliabilityUpft130 = 0; int ReliabilityUpft130Counter = 0; var times_array = new List <double>(tr.Attempts.Count()); foreach (SvmrAttempt a in tr.Attempts) { if (a.IsTraining) { // Это был тренировочный стимул. continue; } allReactionTimes.Add(a.ReactionTimeSeconds * 1000.0f); allReactionErrors.Add(a.ReactionError); // Ага, у нас есть "зачетный" стимул и реакция... // Посмотрим, что за реакция: ошибки, время и т.п. // +1 зачетный стимул TestErrors.TotalCount++; switch (a.ReactionError) { case ReactionError.NoError: TestErrors.NormalCount++; // Сюда кладем время в миллисекундах double reactionTime = (double)((a.ReactionTimeSeconds - CorrectionTimeSeconds) * 1000.0f); times_array.Add(reactionTime); // всем безошибочным ответам КНi присваивается по таблице 2.5" ReliabilityUpft130 += UPFT130Reliability.FromSingleReaction(reactionTime); ReliabilityUpft130Counter += 1; break; case ReactionError.Premature: TestErrors.PrematureCount++; // "всем ошибочным ответам (упреждение, запаздывание) присваивается КНi=0%" ReliabilityUpft130 += 0; ReliabilityUpft130Counter += 1; break; case ReactionError.Missed: TestErrors.MissedCount++; // "всем ошибочным ответам (упреждение, запаздывание) присваивается КНi=0%" ReliabilityUpft130 += 0; ReliabilityUpft130Counter += 1; break; case ReactionError.LogicError: TestErrors.LogicErrorCount++; break; case ReactionError.Cancelled: //Этот атом был отменён. Игнорируем его. break; default: System.Diagnostics.Debug.Fail("WTF? Что это за реакция???????"); break; } } // Можно пронаблюдать все времена и ошибки в ряд... для целей отладки. // allReactionTimes SvmrResults.IPN1 = ReliabilityUpft130Counter == 0 ? 0 : (ReliabilityUpft130 / (double)ReliabilityUpft130Counter); // Фильтрация реакций по времени перед статистической обработкой // Некоторые реакции могут быть переклассифицированы в пропущенные или преждевременные times_array = RejectReactions(times_array); double[] data_for_statistics = times_array.ToArray(); // Отдаем последовательность реакций. SvmrResults.SVMR_REACTIONS = data_for_statistics; // SvmrResults.SvmrIndices.EfficiencyOfOperation = MakeWorkabilityLevel(data_for_statistics); try { var mathStatData = new PskOnline.Math.Statistics.StatData(); // Статистика по отфильтрованным реакциям. PskOnline.Math.Statistics.Calculator.CalcStatistics(data_for_statistics, mathStatData); // Распределение реакций PskOnline.Math.Statistics.Calculator.MakeDistribution(data_for_statistics, mathStatData, HistoMin, HistoMax, HistoStep); // Плотность вероятности для последовательности реакций PskOnline.Math.Statistics.Calculator.MakeProbabilityDensity(data_for_statistics, mathStatData, HistoMin, HistoMax, DensityStep); SvmrResults.SvmrStatistics = _mapper.Map <StatData>(mathStatData); MakeZLParams(SvmrResults.SvmrStatistics, SvmrResults.SvmrIndices); SvmrResults.ResultsStatisticsReliability = 1; } catch (System.ArgumentException) { SvmrResults.ResultsStatisticsReliability = 0; ZeroAllStatistics(Statistics); // throw new DataProcessingException(string.Format(resources.too_few_valid_reactions_in_results_format, data_for_statistics.Length)); } return(base.ProcessorOutputData); }