private void DetectDisturbances(DataGroup dataGroup, VICycleDataGroup viCycleDataGroup) { List <Range <int> > aPhaseDisturbanceRanges = DetectDisturbanceRanges(ToPerUnit(viCycleDataGroup.VA?.RMS)); List <Range <int> > bPhaseDisturbanceRanges = DetectDisturbanceRanges(ToPerUnit(viCycleDataGroup.VB?.RMS)); List <Range <int> > cPhaseDisturbanceRanges = DetectDisturbanceRanges(ToPerUnit(viCycleDataGroup.VC?.RMS)); List <Range <int> > abPhaseDisturbanceRanges = DetectDisturbanceRanges(ToPerUnit(viCycleDataGroup.VAB?.RMS)); List <Range <int> > bcPhaseDisturbanceRanges = DetectDisturbanceRanges(ToPerUnit(viCycleDataGroup.VBC?.RMS)); List <Range <int> > caPhaseDisturbanceRanges = DetectDisturbanceRanges(ToPerUnit(viCycleDataGroup.VCA?.RMS)); List <Disturbance> disturbanceList = aPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VA.RMS, range, Phase.AN)) .Concat(bPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VB.RMS, range, Phase.BN))) .Concat(cPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VC.RMS, range, Phase.CN))) .Concat(abPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VAB.RMS, range, Phase.AB))) .Concat(bcPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VBC.RMS, range, Phase.BC))) .Concat(caPhaseDisturbanceRanges.Select(range => ToDisturbance(viCycleDataGroup.VCA.RMS, range, Phase.CA))) .ToList(); IEnumerable <Range <int> > allDisturbanceRanges = aPhaseDisturbanceRanges .Concat(bPhaseDisturbanceRanges) .Concat(cPhaseDisturbanceRanges) .Concat(abPhaseDisturbanceRanges) .Concat(bcPhaseDisturbanceRanges) .Concat(caPhaseDisturbanceRanges); IEnumerable <Disturbance> worstDisturbances = Range <int> .MergeAllOverlapping(allDisturbanceRanges) .Select(range => { Disturbance worst = null; foreach (Disturbance disturbance in disturbanceList.Where(disturbance => ToRange(disturbance).Overlaps(range))) { if ((object)worst == null || m_isMoreSevere(disturbance.PerUnitMagnitude, worst.PerUnitMagnitude)) { worst = disturbance; } } worst = worst.Clone(); worst.Phase = Phase.Worst; return(worst); }); disturbanceList.AddRange(worstDisturbances); if (disturbanceList.Any()) { m_disturbances.Add(dataGroup, disturbanceList); } }
private void ProcessReportedDisturbances(Meter meter, DataGroup dataGroup) { Line line = dataGroup.Line; if ((object)line == null) { if (meter.MeterLocation.MeterLocationLines.Count != 1) { return; } line = meter.MeterLocation.MeterLocationLines.Single().Line; } List <Disturbance> disturbanceList = dataGroup.Disturbances .Select(disturbance => ToDisturbance(line, disturbance)) .Where(IsDisturbed) .ToList(); if (dataGroup.Samples > 0) { DateTime startTime = dataGroup.StartTime; DateTime endTime = dataGroup.EndTime; TimeSpan duration = (endTime - startTime); foreach (Disturbance disturbance in disturbanceList) { TimeSpan startDuration = disturbance.StartTime - startTime; TimeSpan endDuration = disturbance.EndTime - startTime; disturbance.StartIndex = (int)((startDuration.TotalSeconds / duration.TotalSeconds) * dataGroup.Samples); disturbance.EndIndex = (int)((endDuration.TotalSeconds / duration.TotalSeconds) * dataGroup.Samples); } } IEnumerable <Range <DateTime> > allDisturbanceRanges = disturbanceList .Select(ToDateRange); IEnumerable <Disturbance> worstDisturbances = Range <DateTime> .MergeAllOverlapping(allDisturbanceRanges) .Select(range => { Disturbance worst = null; foreach (Disturbance disturbance in disturbanceList.Where(disturbance => ToDateRange(disturbance).Overlaps(range))) { if ((object)worst == null || m_isMoreSevere(disturbance.PerUnitMagnitude, worst.PerUnitMagnitude)) { worst = disturbance; } } worst = worst.Clone(); worst.Phase = Phase.Worst; return(worst); }); disturbanceList.AddRange(worstDisturbances); if (disturbanceList.Any()) { m_disturbances.Add(dataGroup, disturbanceList); } }