blob: 17122ce66ca0301c004a5d1e9f3ca11658a3c811 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.DispenserAnalyzer.UI.Analysis;
using Tango.DispenserAnalyzer.UI.Models;
using MathNet.Numerics.LinearAlgebra;
using System.Linq.Expressions;
using System.Diagnostics;
namespace Tango.DispenserAnalyzer.UI.Analyzers
{
[Analyzer("flow")]
public class FlowAnalyser : IAnalyzer
{
public Task<List<IAnalyzerResult>> Process(List<DispenserSample> csvRows)
{
return Task.Factory.StartNew<List<IAnalyzerResult>>(() =>
{
List<IAnalyzerResult> results = new List<IAnalyzerResult>();
List<DispenserSample> commands = csvRows.Where(x => x.Command != null && x.Command.ToLower().Contains("label")).ToList<DispenserSample>();
var pairs = commands.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / 2).Select(x => x.Select(v => v.Value).ToList()).ToList();
MovingAverageFilter filter = new MovingAverageFilter();
for (int index = 0; index < pairs.Count(); index++)
{
var pair = pairs[index];
if (pair.Count != 2)
continue;
List<DispenserSample> rangeTestValues = csvRows.Where(x => x.Index > pair[0].Index && x.Index < pair[1].Index).ToList();
if (index % 2 == 1)//testing Flow-error
{
List<DispenserSample> filteredValues = rangeTestValues.Skip(5000).ToList();
// Move Average data
List<Task> tasks = new List<Task>();
int calc_count = (int)filteredValues.Count() / 4;
int start_index = 0;
while (start_index < filteredValues.Count())
{
int calc_amount = (start_index + calc_count) >= (filteredValues.Count() - 4) ? filteredValues.Count() - start_index : calc_count;
var sliceToCalcMoveAverage = new List<DispenserSample>();
sliceToCalcMoveAverage.AddRange(filteredValues.Skip(start_index).Take(calc_amount).ToList());
tasks.Add(Task.Run(() =>
{
filter.Filtering(sliceToCalcMoveAverage);
}));
start_index += calc_amount;
}
Task.WaitAll(tasks.ToArray());
//calculate difference Max Min values for each 250 values
int periodCalcMaxMin = 470;
List<double> differenceMaxMin = new List<double>();
for (int i = 0; i < (filteredValues.Count - periodCalcMaxMin); i+= 200)
{
var rangeItems =(filteredValues.Skip(i).Take(periodCalcMaxMin).ToList());
differenceMaxMin.Add(rangeItems.Max(t => t.Pressure) - rangeItems.Min(t => t.Pressure));
}
//var rangeItems = filteredValues.Select((x, i) => new { x, i }).GroupBy(p => (p.i / 250)).Select(x => x.Select(v => v.x).ToList());
//var differenceMaxMin = rangeItems.Select(x => x.Max(t => t.Pressure) - x.Min(t => t.Pressure)).ToList();
FlowAnalyzerResult result = new FlowAnalyzerResult();
result.AverageValue = filteredValues.Average(t => t.Pressure);
result.SetLocalErrors(differenceMaxMin);
results.Add(result);
}
else//testing PBU
{
PrimingAnalyzerResult result = new PrimingAnalyzerResult();
int avgMinIndex = rangeTestValues.Select(x => x.Index).Min();
int avgMaxIndex = rangeTestValues.Select(x => x.Index).Max();
double totalsec = TimeSpan.FromMilliseconds((avgMaxIndex - avgMinIndex) * 100).TotalSeconds;
result.Time = totalsec.ToString() + " sec";
result.Result = (totalsec <= 11 && totalsec >= 8) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed;
results.Add(result);
}
}
return results;
});
}
public class FlowAnalyzerResult : AnalyzerResultBase
{
[Description("Average Value")]
public double AverageValue { get; set; }
[Description("Errors under 15")]
public string LocalErrorsUnder15 { get; set; }
[Description("Errors greater than or equal to 15 and less than 20")]
public string LocalErrorsUnder20 { get; set; }
[Description("Errors greater than or equal to 20 and less than 25")]
public string LocalErrorsUnder25 { get; set; }
[Description("Errors greater than or equal to 25 and less than 30")]
public string LocalErrorsUnder30 { get; set; }
public FlowAnalyzerResult()
{
// AverageValue = MaxValue = MinValue = TotalValue = FilterAverageValue = FilterMaxValue = FilterMinValue = FilterTotalValue = 0.0;
AverageValue = 0.0;
Result = AnalyzerResultValue.Undetermined;
}
public void SetLocalErrors(List<double> differenceMaxMin)
{
LocalErrorsUnder15 = BuildErrorLog(differenceMaxMin.Where(x => x < 15).ToList());
LocalErrorsUnder20 = BuildErrorLog(differenceMaxMin.Where(x => x < 20 && x >= 15).ToList());
int count = differenceMaxMin.Where(x => x < 25 && x >= 20).Count();
Result = (count <= 10) ? AnalyzerResultValue.Passed : AnalyzerResultValue.Failed;
LocalErrorsUnder25 = BuildErrorLog(differenceMaxMin.Where(x => x < 25 && x >= 20).ToList());
LocalErrorsUnder30 = BuildErrorLog(differenceMaxMin.Where(x => x < 30 && x >= 25).ToList());
}
private string BuildErrorLog(List<double> range_values)
{
int count = range_values.Count();
string logerrors = (count > 10 ? "multiple" : count.ToString());
if(count > 10 && AverageValue > 0)
{
double persentageOfError = (range_values.Max()) / AverageValue * 100;
logerrors = $"multiple{Environment.NewLine} Percentage of errors {persentageOfError.ToString("F2")}";
}
return logerrors;
}
}
public class MovingAverageFilter
{
public MovingAverageFilter()
{
}
public void Filtering(List<DispenserSample> source)
{
int periodAverage = 5;
for (int i = 0; i < (source.Count - 5); i++)
{
source[i].Pressure = source.Skip(i).Take(periodAverage).Average(x => x.Pressure);
}
}
}
}
}
|