private void Calculate_Params_in_EndBreath(StepOfAnalysis flag) { QRSRequested?.Invoke(this, EventArgs.Empty); Expiration = spiroData.GetRange(indexOfPhase[2], spiroData.Count - indexOfPhase[2]); Inspiration = spiroData.GetRange(indexOfPhase[0], indexOfPhase[1] - indexOfPhase[0]); var basics = Basics.GetData(Expiration.Select(i => i.Flow.ParameterValue.Value).ToList(), Inspiration.Select(i => i.Flow.ParameterValue.Value).ToList(), C1_fromATPtoSTPD(), C2_fromBTPStoSTPD(), indexOfPhase[3] - indexOfPhase[0], _settingsPulmonary_Analysis.SampleTime, Logger); if (flag == StepOfAnalysis.TestInRest || flag == StepOfAnalysis.TestInForcedExpiration || flag == StepOfAnalysis.TestInMVV) { _testInRest.WriteData(Expiration.Select(i => i.Flow.ParameterValue.Value).ToList(), Inspiration.Select(i => i.Flow.ParameterValue.Value).ToList(), _settingsPulmonary_Analysis.SampleTime, basics, flag, Logger); } else if (flag == StepOfAnalysis.TestInWorkload) { try { var bufferFET = 10; var volume = Volume.GetData(Expiration.Select(x => x.Flow.ParameterValue.Value).ToList(), Inspiration.Select(x => x.O2.ParameterValue.Value).ToList(), Expiration.Select(x => x.O2.ParameterValue.Value).ToList(), Expiration.Select(x => x.CO2.ParameterValue.Value).ToList(), _settingsPulmonary_Analysis.SampleTime, basics, bufferFET, Logger); var coeff = (Coefficient.Calculate(volume.VE.ParameterValue.Value, volume.VO2_ET.ParameterValue.Value, volume.VCO2_ET.ParameterValue.Value, basics.BF.ParameterValue.Value, _settingsPulmonary_Analysis.Person.Bodyweight, 0, _settingsPulmonary_Analysis.Vdm, Logger)); var pressure = (Pressure.GetData(Inspiration.Select(x => x.O2.ParameterValue.Value).ToList(), Expiration.Select(x => x.CO2.ParameterValue.Value).ToList(), Expiration.Select(x => x.O2.ParameterValue.Value).ToList(), volume.VO2_ET.ParameterValue.Value, volume.VCO2_ET.ParameterValue.Value, volume.VA.ParameterValue.Value, coeff.RER.ParameterValue.Value, bufferFET, Logger)); _breathInWorkLoad.Add(new BreathInWorkLoad(Expiration, Inspiration, basics, volume, coeff, pressure)); IEnumerable <Parameter> parameters = new List <Parameter>(); foreach (var parameter in basics.GetParameters()) { (parameters as List <Parameter>).Add(parameter); } foreach (var parameter in volume.GetParameters()) { (parameters as List <Parameter>).Add(parameter); } foreach (var parameter in coeff.GetParameters()) { (parameters as List <Parameter>).Add(parameter); } foreach (var parameter in pressure.GetParameters()) { (parameters as List <Parameter>).Add(parameter); } (parameters as List <Parameter>).Add(currentQRS); RaiseBreathEnd(parameters); if (_breathInWorkLoad.Count == _settingsPulmonary_Analysis.RangeForDataBreathWriter) { WriterDataBreath(flag); } } catch (Exception ex) { Logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } } }
private async Task WriterDataBreath(StepOfAnalysis flag) { try { switch (flag) { case StepOfAnalysis.TestInRest: await WriteDataInJSON(Path.Combine(_settingsPulmonary_Analysis.PathDirectoryForDataBreath, _nameFileDataRest), _rest); GetTestData(spiroData); _breathInWorkLoad.Clear(); Logger.LogInformation("data {Breath} written successfully", typeof(Rest).Name); break; case StepOfAnalysis.TestInForcedExpiration: await WriteDataInJSON(Path.Combine(_settingsPulmonary_Analysis.PathDirectoryForDataBreath, _nameFileDataRest), _forcedExpiration); GetTestData(spiroData); _breathInWorkLoad.Clear(); Logger.LogInformation("data {Breath} written successfully", typeof(ForcedExpiration).Name); break; case StepOfAnalysis.TestInMVV: await WriteDataInJSON(Path.Combine(_settingsPulmonary_Analysis.PathDirectoryForDataBreath, _nameFileDataRest), _mVV); GetTestData(spiroData); _breathInWorkLoad.Clear(); Logger.LogInformation("data {Breath} written successfully", typeof(MVV).Name); break; case StepOfAnalysis.TestInWorkload: await WriteDataInJSON(Path.Combine(_settingsPulmonary_Analysis.PathDirectoryForDataBreath, _nameFileDataWorkLoad), _breathInWorkLoad); GetTestData(spiroData); _breathInWorkLoad.Clear(); Logger.LogInformation("data {Breath}={_rangeForDataBreathWriter} written successfully", typeof(BreathInWorkLoad).Name, _settingsPulmonary_Analysis.RangeForDataBreathWriter); break; case StepOfAnalysis.EndStep2: await WriteDataInJSON(Path.Combine(_settingsPulmonary_Analysis.PathDirectoryForDataBreath, _nameFileDataWorkLoad), _breathInWorkLoad); GetTestData(spiroData); _breathInWorkLoad.Clear(); Logger.LogInformation("data is fulled {Breath} written successfully", typeof(BreathInWorkLoad).Name); break; default: break; } } catch (Exception ex) { Logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } }
public void FilterData(SampleBreathing data, StepOfAnalysis flag) { q.Enqueue(data); lock (lockObject) { if (q.Count % SizePack == 0) { var result = UseMedianaFilter(q); DataFiltred?.Invoke(result, flag, DateTime.Now); } while (q.Count >= Limit && q.TryDequeue(out overflow)) { Limit = BuffLimit - SizePack + 1; Console.WriteLine($"\n Overflow = " + (overflow as SampleBreathing).Flow.ParameterValue.Value); } Limit = BuffLimit; }
public IEnumerable <Parameter> EndStep(StepOfAnalysis flag) { try { switch (flag) { case StepOfAnalysis.TestInRest: _rest = _testInRest.GetDataRest(); WriterDataBreath(flag); return(_rest.GetParameters()); case StepOfAnalysis.TestInForcedExpiration: if (_rest == null) { _forcedExpiration = _testInRest.GetDataForcedExpiration(0); } else { _forcedExpiration = _testInRest.GetDataForcedExpiration(_rest.VC.ParameterValue.Value); } WriterDataBreath(flag); return(_forcedExpiration.GetParameters()); case StepOfAnalysis.TestInMVV: _mVV = _testInRest.GetDataMVV(); WriterDataBreath(flag); return(_mVV.GetParameters()); case StepOfAnalysis.EndStep2: WriterDataBreath(flag); IEnumerable <Parameter> parameters = new List <Parameter>(); (parameters as List <Parameter>).Add(new Parameter("none", new ParameterValue(0, "none"))); return(parameters); default: return(null); } } catch (Exception ex) { Logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); return(null); } }
private void DetectPhaseOfBreath(SampleBreathing sampleBreathing, StepOfAnalysis flag, DateTime dateTime) { try { spiroData.Add(sampleBreathing); switch (indexOfPhase.IndexOf(0)) { case 0: if (sampleBreathing.Flow.ParameterValue.Value >= _flowThreshold) //Inspiration flow { try { indexOfPhase[0] = spiroData.Count; Logger.LogDebug($"Phase Inspiration dataFlow : {sampleBreathing.Flow.ParameterValue.Value} - dataO2 : {sampleBreathing.O2} - dataCO2 : {sampleBreathing.CO2}"); } catch (Exception ex) { Logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } } break; case 1: if (sampleBreathing.Flow.ParameterValue.Value <= 0 && previous_dataflow >= 0) //End inspiration { try { indexOfPhase[1] = spiroData.Count; Logger.LogDebug($"Phase End inspiration dataFlow : {sampleBreathing.Flow.ParameterValue.Value} - previous_dataflow : {previous_dataflow} - dataO2 : {sampleBreathing.O2} - dataCO2 : {sampleBreathing.CO2}"); } catch (Exception ex) { Logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } } break; case 2: if (sampleBreathing.Flow.ParameterValue.Value <= -_flowThreshold) //Expiration { try { indexOfPhase[2] = spiroData.Count; Logger.LogDebug($"Phase Expiration dataFlow : {sampleBreathing.Flow.ParameterValue.Value} - dataO2 : {sampleBreathing.O2} - dataCO2 : {sampleBreathing.CO2}"); } catch (Exception ex) { Logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } } break; case 3: if (sampleBreathing.Flow.ParameterValue.Value >= 0 & previous_dataflow <= 0) //End Expiration { try { Logger.LogDebug($"Phase End Expiration dataFlow : {sampleBreathing.Flow.ParameterValue.Value} - previous_dataflow : {previous_dataflow} - dataO2 : {sampleBreathing.O2} - dataCO2 : {sampleBreathing.CO2}"); indexOfPhase[3] = spiroData.Count; Calculate_Params_in_EndBreath(flag); spiroData.Clear(); indexOfPhase = new List <int>(4) { 0, 0, 0, 0 }; } catch (Exception ex) { Logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } } break; default: break; } CalculateVolume(sampleBreathing, dateTime); previous_dataflow = sampleBreathing.Flow.ParameterValue.Value; } catch (Exception ex) { Logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } }
/// <summary> /// Основной метод, в который мы посылаем наши данные с периодом дискретизации, который задается в в методе Instance (sampleTime). В данном методе реализована логика разделения по данным Потока на фазы дыхания: 1. Вдох (после преодоления порога в 0.3 л/с и до первого пересечения с нулевой линией). Почему был выбран порог в 0.3 л.с- при попадании в диапозон [-0.3;0.3] л/с идет резкий перепад значений концентраций, также нам надо избавиться от помех [-0.3;0.3] л/с. 2. Фаза конца вдоха - это первый переход через нулевую линию. 3. Фаза выдоха - от -0.3 л.с и до первого перехода через нулевую линию. 4. Фаза конца вдоха - переход через нулевую линию /// </summary> /// <param name="dataFlow">текущее значение потока в л/с</param> /// <param name="dataO2">текущее значение О2 в Об.% (обьемные проценты)</param> /// <param name="dataCO2">текущее значение СО2 в Об.% (обьемные проценты).</param> /// <param name="flag"> Указывает на какой стадии сейчас программа</param> public void AnalyzeSpiroData(double dataFlow, double dataO2, double dataCO2, StepOfAnalysis flag) { _filter.FilterData(new SampleBreathing(dataFlow, dataO2, dataCO2), flag); }
/// <summary> /// (Не надо им пользоваться)Данный метод записывает в режиме реального времени данные в буфер (формирует листы с BasicsCalculations), чтобы по окончании теста провести анализ /// </summary> /// <param name="basics">Базовые вычисления</param> /// <param name="logger">The logger.</param> public void WriteData(List <double> expList, List <double> insList, double sampleTime, Basics basics, StepOfAnalysis flag, ILogger logger) { _logger = logger; _sampleTime = sampleTime; switch (flag) { case StepOfAnalysis.TestInRest: try { Basics_Rest.Add(basics); } catch (Exception ex) { _logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } break; case StepOfAnalysis.TestInForcedExpiration: try { expirationList.Add(expList); inspirationList.Add(insList); Basics_ForcedExp.Add(basics); } catch (Exception ex) { _logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } break; case StepOfAnalysis.TestInMVV: try { Basics_MVV.Add(basics); } catch (Exception ex) { _logger.LogError(string.Format("Error: {0}, Stack: {1}", ex.Message, ex.StackTrace)); } break; default: break; } }