/// <summary> /// Given three of the four current channels, calculates the /// missing channel based on the relationship IR = IA + IB + IC. /// </summary> /// <param name="meterInfo">Data context for accessing configuration tables in the database.</param> public DataSeries CalculateMissingCurrentChannel() { Meter meter; DataSeries missingSeries; // If the data group does not have exactly 3 channels, // then there is no missing channel or there is not // enough data to calculate the missing channel if (DefinedCurrents != 3) { return(null); } // Get the meter associated with the channels in this data group meter = (I1 ?? I2).SeriesInfo.Channel.Meter; if (m_i1Index == -1) { // Calculate I1 = IR - I2 - I3 missingSeries = IR.Add(I2.Negate()).Add(I3.Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meter, m_dataGroup, "Current", "General1"); m_i1Index = m_dataGroup.DataSeries.Count; m_dataGroup.Add(missingSeries); } else if (m_i2Index == -1) { // Calculate I2 = IR - I1 - I3 missingSeries = IR.Add(I1.Negate()).Add(I3.Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meter, m_dataGroup, "Current", "General2"); m_i1Index = m_dataGroup.DataSeries.Count; m_dataGroup.Add(missingSeries); } else if (m_i3Index == -1) { // Calculate I3 = IR - I1 - I2 missingSeries = IR.Add(I1.Negate()).Add(I2.Negate()); missingSeries.SeriesInfo = GetSeriesInfo(meter, m_dataGroup, "Current", "General3"); m_i1Index = m_dataGroup.DataSeries.Count; m_dataGroup.Add(missingSeries); } else { // Calculate IR = I1 + I2 + I3 missingSeries = I1.Add(I2).Add(I3); missingSeries.SeriesInfo = GetSeriesInfo(meter, m_dataGroup, "Current", "RES"); m_i1Index = m_dataGroup.DataSeries.Count; m_dataGroup.Add(missingSeries); } return(missingSeries); }