Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 3
0
        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());
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        } // 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);
        }